Hello Arno, I suggest to write a little logging code to a file in the ThreadDetach method. Just to see if you get there, and how far you get inthere. I think this is the most easy to find out since you dont have the AV always.
--- Rgds, Wilfried [TeamICS] http://www.overbyte.be/eng/overbyte/teamics.html http://www.mestdagh.biz Friday, November 4, 2005, 12:14, Arno Garrels wrote: > Hello, > After a big fight with deadlocks and race conditions for one day my > threaded TWSocketServer derivation is now working stable. > (tested with Wilfrieds GPRS Client and other stressing clients) > But.. I have still a tiny problem with ThreadDetach. > An AV is sometimes raised (see MadExcept trace below) from within > the Execute procedure when csDestroying is in client's ComponentState. > I can work around that by checking for (Client.ComponentState = []) > but I don't think it's good practice. It happens only when the > destructor is called and a lot of threads are busy. > Any idea? > --- > Arno Garrels [TeamICS] > Destructor of TThrdWSocketServer terminates the threads: > for I := 0 to FThreadList.Count -1 do > begin > AThread := TThread(FThreadList[I]); > if PostThreadMessage(AThread.ThreadID, WM_THREAD_TERMINATE, 0, 0) then > begin > Dec(FThreadCount); > Sleep(0); > end; > end; > WM_THREAD_TERMINATE exits PumpMessages() > procedure TWSClientThread.Execute; > var > I : Integer; > Client : TThrdWSocketClient; > Msg : TMsg; > begin > try > { Initialize thread's message queue } > PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE); > SetEvent(EventArray[THREAD_READY_EVENT]); > FReadyForMsgs := TRUE; > FClients := TList.Create; > try > PumpMessages(True); > if not Terminated then > Terminate; > InterlockedDecrement(FServer.FThreadCount); > for I := 0 to FClients.Count -1 do > begin > Client := FClients[I]; > if Assigned(Client) then > Client.ThreadDetach; <= *********AV here************ > end; > finally > FClients.Free; > FClients := nil; > end; > finally > PostMessage(FServer.Handle, WM_THREAD_TERMINATED, Integer(Self), 0); > { Just to make sure the main thread isn't waiting for this thread } > { signal the events } > SetEvent(EventArray[CLIENT_REMOVED_EVENT]); > SetEvent(EventArray[CLIENT_ATTACHED_EVENT]); > end; > end; > exception class : EAccessViolation > exception message : Accessviolation at Address 0048C6C9 in Module > 'TcpSrv.exe'. Read from Address 00000038. > thread $26c (TWsClientThread): > 0048c6c9 TcpSrv.exe WSocket 4159 TCustomWSocket.ThreadDetach > 00495706 TcpSrv.exe WSocketS 906 TWsClientThread.Execute > 00442a36 TcpSrv.exe Classes 9372 ThreadProc > 004049dc TcpSrv.exe System 11554 ThreadWrapper > 0042bcbb TcpSrv.exe madExcept ThreadExceptFrame >>> created by main thread ($6ec) at: > 0049539a TcpSrv.exe WSocketS 787 TWsClientThread.Create > main thread ($6ec): > 7c91eb94 ntdll.dll KiFastSystemCallRet > 7c91e64c ntdll.dll NtSetInformationThread > thread $3fc: <priority:1> > 7c91eb94 ntdll.dll KiFastSystemCallRet > 7c91e319 ntdll.dll NtRemoveIoCompletion > thread $314: >>> stack not accessible > thread $798: >>> stack not accessible > thread $778: >>> stack not accessible > thread $90 (TWsClientThread): > 7c91eb94 ntdll.dll KiFastSystemCallRet > 7c91e9be ntdll.dll NtWaitForSingleObject > 7c8025d5 kernel32.dll WaitForSingleObjectEx > 7c80253d kernel32.dll WaitForSingleObject > 00426e8a TcpSrv.exe madExcept HandleException > 0042bd4d TcpSrv.exe madExcept HookedTThreadExecute > 7c91eaf5 ntdll.dll KiUserExceptionDispatcher > 0048c6c9 TcpSrv.exe WSocket 4159 TCustomWSocket.ThreadDetach > 00495706 TcpSrv.exe WSocketS 906 TWsClientThread.Execute > 00442a36 TcpSrv.exe Classes 9372 ThreadProc > 004049dc TcpSrv.exe System 11554 ThreadWrapper > 0042bcbb TcpSrv.exe madExcept ThreadExceptFrame >>> created by main thread ($6ec) at: > 0049539a TcpSrv.exe WSocketS 787 TWsClientThread.Create > thread $728: >>> stack not accessible > thread $374 (TWsClientThread): > 7c91eb94 ntdll.dll KiFastSystemCallRet > 7c91e9be ntdll.dll NtWaitForSingleObject > 7c8025d5 kernel32.dll WaitForSingleObjectEx > 7c80253d kernel32.dll WaitForSingleObject > 00426e8a TcpSrv.exe madExcept HandleException > 0042bd4d TcpSrv.exe madExcept HookedTThreadExecute > 7c91eaf5 ntdll.dll KiUserExceptionDispatcher > 0042bd26 TcpSrv.exe madExcept HookedTThreadExecute > 00442a36 TcpSrv.exe Classes 9372 ThreadProc > 004049dc TcpSrv.exe System 11554 ThreadWrapper > 0042bcbb TcpSrv.exe madExcept ThreadExceptFrame >>> created by main thread ($6ec) at: > 0049539a TcpSrv.exe WSocketS 787 TWsClientThread.Create > disassembling: > 0048c67c public WSocket.TCustomWSocket.ThreadDetach: ; function entry > point > 0048c67c 4153 push ebp > 0048c67d mov ebp, esp > 0048c67f push ecx > 0048c680 mov [ebp-4], eax > 0048c683 4154 call -$85750 ($406f38) ; Windows.GetCurrentThreadId > 0048c683 > 0048c688 mov edx, [ebp-4] > 0048c68b cmp eax, [edx+$548] > 0048c691 jz loc_48c6a0 > 0048c691 > 0048c693 4155 mov edx, $48c6d8 ; 'Cannot detach from other > thread' > 0048c698 mov eax, [ebp-4] > 0048c69b mov ecx, [eax] > 0048c69d call dword ptr [ecx+$64] > 0048c69d > 0048c6a0 loc_48c6a0: > 0048c6a0 4157 mov eax, [ebp-4] > 0048c6a3 cmp dword ptr [eax+$458], -1 > 0048c6aa jz loc_48c6c4 > 0048c6aa > 0048c6ac 4158 push 0 > 0048c6ae xor ecx, ecx > 0048c6b0 mov eax, [ebp-4] > 0048c6b3 mov edx, [eax+$40] > 0048c6b6 mov eax, [ebp-4] > 0048c6b9 mov eax, [eax+$458] > 0048c6bf call -$1698 ($48b02c) ; > WSocket.WSocket_Synchronized_WSAAsyncSelect > 0048c6bf > 0048c6c4 loc_48c6c4: > 0048c6c4 4159 mov eax, [ebp-4] > 0048c6c7 mov edx, [eax] 0048c6c9 >> call dword ptr [edx+$38] > 0048c6c9 > 0048c6cc 4160 pop ecx > 0048c6cd pop ebp > 0048c6ce ret -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be