[fpc-devel] SimpleIPC and TWinMsgServerComm.PeekMessage

Sven Barth pascaldragon at googlemail.com
Wed Oct 9 13:52:41 CEST 2013

Am 09.10.2013 10:40, schrieb Juha Manninen:
> I am testing SimpleIPC with components/chmhelp/lhelp
> and
> components/chmhelp/democontrol/lhelpconnectiondemo1
> The latter works as a master application, sending a file name to lhelp
> and starting it if not running already.
> On Linux this works perfectly. The return message status is always "Success".
> On Windows there is a bug when lhelp is not yet running and it must be started.
> In TWinMsgServerComm.PeekMessage() (part of SimpleIPC),
> if Windows.PeekMessage() failed, the idea is to wait a given TimeOut
> and then try again:
>    R:=MsgWaitForMultipleObjects(1,FHWND,False,TimeOut,QS_SENDMESSAGE);
>    B:=(R<>WAIT_TIMEOUT);
> The caller gives 50 ms as timeout but also uses a loop for 5 seconds
> total timeout.
> It should be enough for even slowly starting processes.
> However, when the process does not exist yet,
> MsgWaitForMultipleObjects returns WAIT_FAILED instead of WAIT_TIMEOUT,
> and it does NOT wait. It returns immediately.
> I was able to fix it like this:
>    R:=MsgWaitForMultipleObjects(1,FHWND,False,TimeOut,QS_SENDMESSAGE);
>    if R=WAIT_FAILED then
>      Sleep(TimeOut);
> The fix can be tested with lhelpconnectiondemo1.
> Currently the first reply status is NoAnswer, after the fix it is Success.
> If you think the fix is OK, I can make a patch.
You might want to take a look at WaitForInputIdle.

MSDN entry: 
Informative blog entry: 

In my opinion you should use this in TLHelpConnection.StartHelpServer. 
Though you could add it in TWinMsgServerComm as well, as we rely on 
messages anyway...


More information about the fpc-devel mailing list