On Thu, 20 Jan 2011, Michael Schnell wrote:

After some more thinking about the issue:

Obviously doing Event Queues with the current Linux based Widget Types is not easy to do (in the way it is done right now). In some revisions PostMessage does not work at all, in some revisions TApplication.QueueAsyncCall does not work as expected, in some revisions TThread.Synchronize does not work as expected (While TThread.Queue is not implemented at all).

As far as I understand, (e.g.) the gtk (2) Widget Set is used by a "loop" (repeated call or callback) that alternately runs the Widget Set code and the application program code, while the widget set code (additionally) performs callbacks into the application program code when a GUI event is fired by the user's interaction.

Now, at some point the code (GUI Thread) needs to go to sleep if nothing is to be done. It seems like the Widget Set is done in a way that it automatically wakes up the GUI Thread when user interaction is detected and thus the appropriate Callback is done and seemingly as a consequence, the "loop"ed code in the application program is executed, too, resulting in execution of all events scheduled up till now.

This results in the problem, that waking up the program whenever an event is to be handled that is not generated by the Widget Set, is not that easy to do. (Especially regarding that doing too much polling will degrade the overall performance.)

With Windows, this problem does not appear, as non-GUI events are scheduled by a PostMessage() or PostThreadMessage() API call, that automatically wake up the target-thread.

So a more radical way of Event handling with Linux could be worth considering.

The Widget Set could be assigned to a dedicated thread, while it's callbacks are transferred to the main thread via the application's message queue (that is implemented anyway) by Application.QueueAsyncCall().

The Pro being:
- The Main thread is completely independent of the GUI, the sleeping and waking of the main thread can be done with pure Linux means, automatically scheduling the GUI- and the non-GUI- events appropriately, while the GUI thread does it's work undisturbed by that. - no necessity to permanently run (poll) the Widget Set loop, reducing the overall CPU time

That's wrong. The thread would then run the widget set loop, since that must
be run in every scenario. And Poll() does not consume any CPU.

I would never use a widget set with the structure you describe. Threading
problems are extremely difficult to debug, doubly so in an event based
system. What's more, X11 is not thread-safe at all.

Michael.

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to