Graeme Geldenhuys schrieb:
Some developers prefer to pass in a GUI component to a thread
instance, so the thread knows what widget to update. Other users
prefer to post a "gui update" message to the application event queue.

I'm very new to threads and might know just enough to make in
dangerous. :-)  In fpGUI the application's "custom" event queue is a
linked-list structure.  If threads post messages to that queue, I
obviously need to make the queue manipulation code thread safe.

fpgApplication is a global singleton of the TfpgApplication class.
fpgPostMessage() is a stand-alone function (not a member of
TfpgApplication class).  To make fpgPostMessage() thread save, I
instantiated a TCriticalSection instance in the TfpgApplication class
- in the constructor. I added two member functions .Lock and .Unlock
which calls FCritSect.Enter and FCritSect.Leave respectively.  In
fpgPostMessage, I call fpgApplication.Lock, then manipulate the
message queue and then call fpgApplication.Unlock.

Is this the correct way to make my event queue thread save?

It is - theoretically. I use threads quite a lot and found it a constant source of problems, to create a deadlock here and there when using the messagequeue or to forget some lock/unlock somewhere. (you will need more than PostMessage for your queue! *bg*)

I prefer to implement the messaging in the object it belongs to - in this case on fpgApplication. The Queue will not be visible from outside, only funcions like PostMessage, GetMessage or DiscardMessage. This way you can make shure, the lock/unlock sequence will be used correctly...

Regards
Lukas
(Just seen that Vincent was a bit faster than me, but with quite the same thougts...)


--

--------------------------
software security networks
Lukas Gradl <fpc#ssn.at>
Eduard-Bodem-Gasse 9
A - 6020 Innsbruck
Tel: +43-512-214040-0
Fax: +43-512-214040-21
--------------------------
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to