<p>Am 15.09.2014 14:21 schrieb "Xiangrong Fang" <<a href="mailto:xrfang@gmail.com">xrfang@gmail.com</a>>:<br>
><br>
> 2014-09-15 17:23 GMT+08:00 Michael Schnell <<a href="mailto:mschnell@lumino.de">mschnell@lumino.de</a>>:<br>
>><br>
>><br>
>> In that case I definitely would use Application.QueuAsyncCall.<br>
><br>
><br>
> If I understand correct, from this page:<br>
><br>
> <a href="http://wiki.freepascal.org/Asynchronous_Calls">http://wiki.freepascal.org/Asynchronous_Calls</a><br>
><br>
> QueueAsyncCall is, like what its name suggest, doing this in asynchronous favor -- it execute queued method in the next message loop (while Application.ProcessMessages takes place, right?).<br>
><br>
> But what I need PostMessage for is to notify main thread (or another thread) that a worker thread finished its job, so that the thread manager can start a new thread to do the remaining work.</p>
<p>PostMessage is asynchronous as well. For a synchronous way I'd suggest you to take a look at TThread.Synchronize and corresponding documentation and tutorials.</p>
<p>Note: Synchronize can only notify the main thread.<br>
Note2: The synchronous alternative to PostMessage would be SendMessage, though I don't know whether Lazarus provides this in a cross platform way</p>
<p>If you want to use a separate thread ("dispatcher") for enqueueing new work you should create an event that you pass to this thread and the worker threads. The dispatcher waits on the event and the worker threads will signal the event once they are done. Of course you'll likely also signal the event when new work items are queued that need to be dispatched.</p>
<p>Regards,<br>
Sven</p>