[fpc-pascal] lnet for TCP daemon
Michael Schnell
mschnell at lumino.de
Wed Sep 18 09:32:54 CEST 2013
Conclusion:
Thus we could draft a "living noGUI" TCustomApplication sibling (aka
"LCL WidgetType"), that allows for firing MainThread Events triggered
from (a newly implemented) TTimer, TThread.Queue(),
TThread.Synchronize(), TApplication.QueueAsyncCall() and the legacy
windowish PostMessage() -> "procedure..message" mechanism in a low
latency and low processor-overhead way:
- The Application Object contains a MainLoop simply calling
CheckSynchronize()
- TTimer is implemented including defining the timeout constant for
calls to CheckSynchronize() as the greatest common denominator of the
"Time" property of all enabled TTimer instances in the project (i.e. a
simple timer that accumulates delays imposed by MainThread activities)
- TThread.Queue() and TThread.Synchronize() seemingly just work
- TApplication.QueueAsyncCall() and PostMessage() could be implemented
using "NotifyMainThread()" (and maybe slightly enhancing the queuing and
de-queuing mechanism provided in the RTL for additionally allowing for
this type of Events, containing procedure pointer, self-pointer and an
Integer that can be pointer to a parameter or holds the Windows-Message
parameters. )
This would provide the mechanism for porting "embedded" (thus without
GUI - or with the GUI configured as "disabled" at compile time) Delphi
applications to non-GUI Linux gadgets.
It is really frustrating to see, that this now seems to solves the issue
I am hunting for since some five years. Over the time, there had been
multiple discussions on this, initially in the fpc devel mailing list
and later in the Lazarus devel mailing list. Up till now, I never was
told "this already works" or "this is easy" (followed by a decent
description - such as yours - of CheckSynchronize() and
WakeMainThread(). Instead I was told that I should look at the LCL
source code and that "in Windows, the Event queuing mechanism is done by
Windows itself and in Linux it is done by a queue in the LCL that is
managed by the underlying Widget Set". This (some years ago) misled me
to invest a considerable amount of time in unsuccessfully trying to
strip off the GUI binding from an existing LCL Widget Type.
Unfortunately until end of this year I will am busy with a complicated
(non pascal and not even Linux) project and I'll be not able to do some
other programming work (and hopefully provide a patch enabling the
functionality described above). But If somebody wants we can go on
discussing the issue here, at "fpc devel" or at "lazarus devel".
Thanks for listening,
-Michael
More information about the fpc-pascal
mailing list