2011/5/2 Michael Schnell <[email protected]>:

> PostMessage() and QueueAsyncCall() _should_ work.

PostMessage() works (that is what I currently use) and
QueueAsyncCall() did not work when I opened this thread, I will test
it again tomorrow.

But what I would need for my application is something like
Synchronize(), I need to block my camera thread after every frame
until the GUI has updated itself with the newly received frame.
Therefore I have now re-implemented the functionality of Synchonize()
in the following way:

    // normally I would have used Synchoize() here but this
    // does not work with the really old GTK2 I have here anymore,
    // it would not wake up the GUI thread until I move the mouse.
    // The following 3 lines together with the message method in the
    // main form do exactly the same. It wakes up the GUI thread and
    // waits until it is done.
    RTLeventResetEvent(GuiHasFinishedEvent);
    PostMessage(Application.MainForm.Handle, MM_FRAME_COMPLETE, 0, 0);
    RTLeventWaitFor(GuiHasFinishedEvent);


and in the GUI

TMainForm = Class(TFom)
   ...
   procedure OnCameraFrame(var Msg); message MM_FRAME_COMPLETE;
   ...
end;

procedure TMainForm.OnCameraFrame(var Msg);
begin
  // it is alaways in updating state, only release this for a short moment
  Display.Picture.Bitmap.EndUpdate();
  Display.Picture.Bitmap.BeginUpdate();

  // the camera thread is waiting, notify it that we are done.
  RTLeventSetEvent(GuiHasFinishedEvent);
end;

This works like a charm.

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

Reply via email to