[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