[Lazarus] Threads
Antonio Fortuny
a.fortuny at sitasoftware.lu
Fri Mar 23 15:36:23 CET 2012
Le 23/03/2012 15:24, Michael Schnell a écrit :
> It's rather straight forward to do completely distinct threads.
>
> The tricky part starts, when the threads need to communicate (which
> always is necessary) and thus share some data.
>
> Here you need to be aware of several things:
>
> - the components and functions in the LCL and RTL usually are not
> thread-save (and there is no documentation on in what way they are
> "partly thread safe) e.g.
> - - Many simple functions like IntToStr() seem to thread safe, but
> this is not documented.
> - - You can't use any function that accesses the GUI in another
> thread but the main thread.
> - - You can happily use multiple instances of TList in multiple
> threads as long as each a single instance is not used by multiple
> threads.
> - - You can use the same instance of TList in multiple threads if you
> use a TCtriticalSection (e.g. one for each instance of TList) do block
> concurrent accesses.
> - - AFAIK, the way TThreadList is used with multiple threads is
> documented.
>
> - To have a worker thread communicate with the main thread (i.e. to
> have it use the GUI in any way) you can use TThread.Synchronize.
> Downside: The thread waits until any scheduled main thread activity is
> done before entering the synchronized code (might last forever). It
> only goes on working when the synchronized code is done.
>
> - To trigger a main thread activity without having to wait for the
> main thread you can use Application.QueueAsnycCall.
>
> - The functionality of TThread.Synchronize and
> Application.QueuAsyncCall is not available in all Widget Types (see
> Compile-Options -> Build Modes). It is verified to work decently in
> GTK and Win32 (and supposedly QT, but I did not check this myself).
All those are the basics that I apply since I'm busy writing threads
code. I already make use of Critical sections and events lock some
external resources (log files for instance) and I avoid to have any
thread code using any kind of GUI. All thread code I write, is contained
in OS services or very specialized programs having no GUI at all.
Anyway, thanks for precisions.
Antonio.
> -Michael
>
> --
> _______________________________________________
> Lazarus mailing list
> Lazarus at lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
>
More information about the Lazarus
mailing list