[Lazarus] TThread.WaitFor blocks the main event loop under Linux

Michael Van Canneyt michael at freepascal.org
Mon Oct 11 15:23:45 CEST 2010



On Mon, 11 Oct 2010, Michael Schnell wrote:

> On 10/11/2010 01:15 PM, Michael Van Canneyt wrote:
>> 
>> 
>> 1. Make sure you make something that can be integrated with the FPC 
>> rtl/FCL.
> This would supposedly be doable be based on MSE's code. But it would need to 
> include quite a lot of MSE code lines, as the Event queue type is nicely 
> structured and derived form more basic queue types that would need to be 
> used.
>
> it would not be really easy to test it as it does not synchronize with GUI 
> events when used with Lazarus.

I thought the one of the points was to have a message queue also when there 
is no GUI ? This should be testable, no ?

>> 2. Once that is done and it is performing as expected, it should not be 
>> hard
>>    to convince the Lazarus people to use it.
> I doubt that, as it would need to replace the basic event management in all 
> Widget sets, They even two manage complete different KDE Widget Type code 
> bases because they don't want to take the risk of breaking old code when 
> having it use using common functions with the new KDE Widget Type. Moreover 
> all other Widget Types (GNU, Mac, fpGUI) have their own implementation of an 
> Event queue in Pascal code, and the Windows Widget Type uses the OS'es 
> Message queue. Replacing all of them with the methods provided by the RTL 
> would be necessary (and GUI events would need to be merged in the way all but 
> Windows Widget Set code does)

That's what I meant with a paradigm shift.

>> 
>> If of course you expect to achieve a total shift in paradigm, then you'll 
>> be disappointed, because Delphi compatibility is paramount.
> Of course Delphi code would need to run in the same way as it does at the 
> moment, I don't think this is difficult to be achieved.
>> 
>> I beg to differ. From my perspective, people bring up issues, you bring up
>> the event mechanism in one of the replies.
> Only if I the event mechanism is the only I see how to solve the problem.

In that case, you see this quite often. Or, maybe more accurate, more than I
would.

>> 
>> At least, it would be a start. Now there is nothing, so we cannot even 
>> verify that your mechanism is indeed a superior mechanism, as you claim.
> In fact Lazarus does provide Windowistic Messages from a thread to the Main 
> Thread as a basic event mechanism. I did test this some months ago and it did 
> work fine. But it seems to be broken for Linux (KDE) with the current svn 
> version. "My mechanism" is superior in that it would be usable without a GUI 
> (that is why I did the work on that some months ago) and would be implemented 
> in a centralized way independent of the GUI and thus the code should be 
> better manageable.
>
> Regarding functionality it _could_ be better: Windowish messages provide 
> three free queued 32 Bit parameters to  the event handler procedure. An 
> implementations like Delphi's "TThread.Queue" would provide no parameter (but 
> self). A decent event queue _could_ be implemented like an an RPC scheduler 
> and provide any number of marshalized queued parameters.
>> 
>> While I agree that an object is a clean approach, for most purposes, an 
>> object is simply unnecessary overhead, because it requires additional heap 
>> storage.
> A simple implementation for something like TThread.Queue would need to do a 
> queue of recored with a pointer to the procedure and it's self pointer. A 
> more advanced implementation would additionally need marshalized parameters. 
> Maybe a sensible approach is doing a queue of three words: procedure pointer, 
> self pointer and additional pointer. This would allow for (1) reproducing 
> TThread Queue and (2) allow for parameters on the heap with the additional 
> pointer pointing at same. If we want to reproduce the Windowish Message stuff 
> (for Delphi compatibility) I suppose it would be good to use four Integers as 
> queue records (avoiding the term Object).

Since integer is 32-bit, and you'd need 64-bit for pointers, you'll need to
test what size windows messages have.

Once more: please provide a patch.

Michael.




More information about the Lazarus mailing list