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? eg: procedure fpgPostMessage(Sender, Dest: TObject; MsgCode: integer; var aparams: TfpgMessageParams); overload; var p: PfpgMessageRec; begin if Dest = nil then Exit; //==> fpgApplication.Lock; // Enter the critical section try p := fpgAllocateMessage; if p <> nil then begin p^.MsgCode := MsgCode; p^.Sender := Sender; p^.Dest := Dest; p^.Params := aparams; end else DebugLn('THE MESSAGE QUEUE IS FULL.'); finally fpgApplication.Unlock; // leave the critical section end; end; Regards, - Graeme - _______________________________________________ fpGUI - a cross-platform Free Pascal GUI toolkit http://opensoft.homeip.net/fpgui/ _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal