Hi,

[Just as well the Lazarus IDE didn't get the thread update mentioned a
few days ago... where a thread was doing work, and the main thread was
waiting for that thread to finish... it wouldn't have worked under
Linux it seems.]


I just stumbled across this issue in fpGUI, and I see MSEgui and
LCL-GTK2 has the
exact same problem. See attached project. I haven't tried LCL-QT, but I presume
that same issue will persist.

A simple program (just for illustrative purposes), where a thread
updates the progress bar (the thread could be doing any long running process).
Click the button, it creates a thread and
starts it off. If then waits for the thread to finish, then displays
that it has finished in the GUI, and free's the thread manually.

If you use the MyThread.WaitFor to wait for the thread to finish, then
the application is instantly frozen (even the thread), nothing gets
updated and you have to kill the process. For some reason
WaitFor blocks the main thread's event loop. It seems this issue is
only under FPC apps and under X11 (no matter the GUI toolkit),
it works fine under Windows.

The work around, is to use a boolean variable in the thread class, and
a while loop which checks if the boolean variable is true, if not it
calls Application.ProcessMessages (to keep the app alive).

Like I said, this is a stupid example, but it illustrates that WaitFor
cannot be used under X11 (for our GUI toolkits). Any ideas as to why
WaitFor blocks the main event loop? Is it a Linux thing, X11 thing, or
just that we made a mistake somewhere?

So what is wrong? Is it the TThread.WaitFor implementation that is
flawed? Is it X11 that is flawed, or just GUI toolkit developers that
don't know how to code (thought I doubt it's the latter). :)

As an experiment (I'm all out of ideas now), I dived into the
TThread.WaitFor implemenation, as saw that it calls
WaitForThreadTerminate() with no timeout value. I though, well, let me
try calling WaitForThreadTerminate() directly with say a 2 second
timeout. No luck there. The instant you call that, the application is
frozen. It never times out either, so the FPC+Unix
WaitForThreadTerminate() functions seems broken too. :-/

I guess I need to file a FPC bug report about WaitForThreadTerminate()
being broken under Linux, but I wanted others to confirm this first,
before I do.

Did anybody know about this? Anybody know how we can get
TThread.WaitFor to actually work under Linux/Unix?


--
Regards,
  - Graeme -


_______________________________________________
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net:8080/fpgui/

Attachment: threadlcl_waitfor.tar.gz
Description: GNU Zip compressed data

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

Reply via email to