Francois PIETTE wrote:
>> Can you please help me? Something like below,
>> or do I still haven't got it fully?
> 
> Looks partially good.
> The problem, if I understand your code correctly, is that for the new
> window, the message numbers have not the same numbers. You must map
> old message numbers to the new message numbers before posting them to
> the new window.

Your are right, it can't be done in a single method, probably there
should be a helper function to return queued messages in a Tlist, so 
they can be posted later after the thread has been attached again.

> 
> --
> [EMAIL PROTECTED]
> http://www.overbyte.be
> 
> 
> ----- Original Message -----
> From: "Arno Garrels" <[EMAIL PROTECTED]>
> To: "ICS support mailing" <twsocket@elists.org>
> Sent: Sunday, June 11, 2006 3:18 PM
> Subject: Re: [twsocket] Enhancements for Thread Attach/Detach methods
> 
> 
>> Francois PIETTE wrote:
>>>> In V6, how can I extract messages of the to be detached socket
>>>> only? Is it Peekmessage(Msg, OldHWnd, MsgLow, MsgLow + MsgCnt,
>>>> PM_REMOVE)? 
>>> 
>>> No. This would retrieve all messages for all component sharing the
>>> same TIcsWndHandler.
>>> It is necessary to iterate thru FMsgMap to find all occurence of
>>> self and get the corresponding message numbers (see
>>> TIcsWndHandler.AllocateMsgHandler) to use in PeekMessage. It is not
>>> guaranteed that all messages numbers for a given component are
>>> contiguous altough it will most of the time.
>>> 
>>> The problem is to retrieve all message from the old queue and post
>>> them in the new queue in the same order. This can be solved by
>>> examining the time member in TMsg record.
>> 
>> Can you please help me? Something like below, or do I still haven't
>> got it fully?
>> 
>> procedure TIcsWndControl.MoveQueuedMessages(NewHwnd: HWND);
>> var
>>    I   : UINT;
>>    Idx : Integer;
>>    Msg : tagMsg;
>>    P   : PMsg;
>>    L   : TList;
>> 
>>    function CmpFunc(Item1: Pointer; Item2: Pointer): Integer;
>>    begin
>>        if PMsg(Item1)^.time = PMsg(Item2)^.time then
>>            Result := 0
>>        else if PMsg(Item1)^.time > PMsg(Item2)^.time then
>>            Result := 1
>>        else
>>            Result := -1;
>>    end;
>> 
>> begin
>>    L := TList.Create;
>>    try
>>        I := 0;
>>        while I < WH_MAX_MSG do
>>        begin
>>            if FWndHandler.FMsgMap[I] = Self then
>>            begin
>>                while PeekMessage(Msg, Handle, I +
>> FWndHandler.FMsgLow,                                  I +
>> FWndHandler.FMsgLow, PM_REMOVE) do                begin
>>                    New(P);
>>                    //P^.hwnd      := Msg.hwnd;
>>                    P^.message   := Msg.message;
>>                    P^.wParam    := Msg.wParam;
>>                    P^.lParam    := Msg.lParam;
>>                    P^.time      := Msg.time;
>>                    L.Add(P);
>>                end;
>>            end;
>>            Inc(I);
>>        end;
>>        L.Sort(@CmpFunc);
>>        for Idx := 0 to L.Count - 1 do
>>            PostMessage(NewHwnd, PMsg(L[Idx])^.message,
>> PMsg(L[Idx])^.wParam,
>>                        PMsg(L[Idx])^.lParam);
>>    finally
>>        for Idx := 0 to L.Count - 1 do
>>            System.Dispose(L[IDX]);
>>        L.Free;
>>    end;
>> end;
>> 
>> 
>> 
>> 
>>> --
>>> [EMAIL PROTECTED]
>>> http://www.overbyte.be
>>> 
>>> 
>>> 
>>> ----- Original Message -----
>>> From: "Arno Garrels" <[EMAIL PROTECTED]>
>>> To: "ICS support mailing" <twsocket@elists.org>
>>> Sent: Sunday, June 11, 2006 9:49 AM
>>> Subject: Re: [twsocket] Enhancements for Thread Attach/Detach
>>> methods 
>>> 
>>> 
>>>> Francois PIETTE wrote:
>>>>>> AFAIK winsock API function WSAAsyncSelect() is a common, blocking
>>>>>> function. In this case it's called to disable winsock
>>>>>> notifications. Because the window is detached/destroyed in
>>>>>> subsequent lines. BTW: Same is done in V5.
>>>>>> So for a short while the detached socket is windowless, that's
>>>>>> why I suggested to wait w/o processing messages until it is
>>>>>> attached again (not nice but worked for me).
>>>>> 
>>>>> To be safe, the order should be:
>>>>> 1) Stop notifications from winsock (WSAAsyncSelect) to the current
>>>>> (old) hidden window
>>>>> 2) Create the new hidden window
>>>>> 3) Extract all messages from old hidden window queue and push them
>>>>> to the new queue
>>>> 
>>>> In V6, how can I extract messages of the to be detached socket
>>>> only? Is it Peekmessage(Msg, OldHWnd, MsgLow, MsgLow + MsgCnt,
>>>> PM_REMOVE)? 
>>>> 
>>>> ---
>>>> Arno Garrels [TeamICS]
>>>> http://www.overbyte.be/eng/overbyte/teamics.html
>>>> 
>>>> 
>>>> 
>>>>> 4) Restart notifications from winsock to the new hidden window
>>>>> 
>>>>> Probably a good idea to post a FD_READ message in the new queue
>>>>> between 3 and 4 above. Because it may happend that data has been
>>>>> received during the time interval when notifications have been
>>>>> disabled.
>>>>> 
>>>>> --
>>>>> [EMAIL PROTECTED]
>>>>> 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
>> --
>> 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