Francois PIETTE wrote:
> Do you know what is causing the AV ?
> I mean the AV occur from OndataAvailable but when accessing what ?

Hard to say. Here's an image: http://www.duodata.de/misc/thrdAV.png

The first line where the IDE shows the green arrow in procedure 
TSimpleThreadedSslServerForm.ClientDataAvailable after the AV is
=> ProcessData(Sender as TMyClient);
Previous line is Display() but Display is wrapped in a critical section.
The AV happens when I destroy the component while the stressing client
is still trying to do his work.

>> From the destructor, the component is still allocated.

Yes

Arno

> 
> --
> [EMAIL PROTECTED]
> http://www.overbyte.be
> 
> ----- Original Message -----
> From: "Arno Garrels" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <twsocket@elists.org>
> Sent: Wednesday, March 01, 2006 5:19 PM
> Subject: Re: [twsocket] Triggering events
> whencsDestroyingisinComponentState?
> 
> 
>> Francois Piette wrote:
>>>> When I destroy the SimpleThrdSslServer with alot of threads and clients
>>>> I can avoid AV's by this code:
>>>> 
>>>> function TCustomWSocket.TriggerDataAvailable(Error : Word) : Boolean;
>>>> begin
>>>>     Result := Assigned(FOnDataAvailable) and not (csDestroying in
>>>> ComponentState);     if not Result then
>>>>         Exit;
>>>> ...
>>> 
>>> At first glance, I don't see why this code would cause trouble in
>>> existing application. But why don't put it in the application code ?
>> 
>> Because I think that DataAvailable should not be triggered when the
>> component is destroyed anyway, but I may be wrong.
>> 
>> I've played with the TWSocketThrdServer and modified it to always
>> wait for the threads, now FreeOnTerminate is _always_ set to FALSE.
>> You know that the threads post WM_THREAD_TERMINATED at the end of
>> method execute to the server window. So, in destructor messages must
>> be processed. If you have a better idea please let me know.
>> May be this is the reason why I get random AV's in OnDataAvailable.
>> Note that I'm stress-testing with a client that connects, sends
>> a request and server echos the request, this all very fast, one
>> after the another, until there are up to thousand concurrent
>> connections.
>> 
>> 
>> procedure TWSocketThrdServer.WmThreadTerminated(var Msg: TMessage);
>> var
>>    AThread : TWsClientThread;
>>    I      : Integer;
>> begin
>>    AThread := TObject(Msg.WParam) as TWsClientThread;
>>    I := FThreadList.IndexOf(AThread);
>>    if I > -1 then
>>        FThreadList.Delete(I);
>>    AThread.WaitFor;
>>    if Assigned(FOnBeforeThreadDestroy) then
>>        FOnBeforeThreadDestroy(Self, AThread);
>>    if not AThread.FreeOnTerminate then
>>        AThread.Destroy;
>> end;
>> 
>> 
>> {* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>> * *}
>> procedure TWSocketThrdServer.TerminateThreads;
>> var
>>    AThread : TWsClientThread;
>>    I       : Integer;
>> begin
>>    for I := 0 to FThreadList.Count - 1 do begin
>>        AThread := TWsClientThread(FThreadList[I]);
>>        if PostThreadMessage(AThread.ThreadID,
>>                             WM_THREAD_TERMINATE, 0, 0) then begin
>>            InterlockedDecrement(FThreadCount);
>>            Sleep(0);
>>        end;
>>    end;
>> end;
>> 
>> 
>> destructor TWSocketThrdServer.Destroy;
>> var
>>    WaitRes : LongWord;
>>    Dummy   : Byte;
>>    Msg     : tagMsg;
>> begin
>>    Pause; // while waiting for our threads don't accept new clients!!
>>    TerminateThreads;
>>    try
>>        if FThreadList.Count > 0 then
>>        repeat
>>            WaitRes := MsgWaitForMultipleObjects(0, Dummy, FALSE, 500,
>>                                             QS_POSTMESSAGE or
>> QS_SENDMESSAGE);
>>            if WaitRes = WAIT_FAILED then
>>                raise Exception.Create('Wait for threads failed ' +
>>                                       SysErrorMessage(GetLastError))
>>            else if WaitRes = WAIT_OBJECT_0 then
>>                while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
>>                begin
>>                    TranslateMessage(Msg);
>>                    DispatchMessage(Msg);
>>                end;
>>        until FThreadList.Count = 0;
>>    finally
>>        inherited Destroy;
>>        FreeAndNil(FThreadList);
>>    end;
>> end;
>> 
>> --
>> 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
-- 
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

Reply via email to