[Lazarus] Thread finalization
Leonardo M. Ramé
l.rame at griensu.com
Wed Sep 21 15:06:21 CEST 2011
On 2011-09-21 14:55:06 +0200, Sven Barth wrote:
> Am 21.09.2011 14:31, schrieb Leonardo M. Ramé:
> >I'm having a rough time with Threads.
> >
> >When my app starts, it creates an instance of a TThread that loads a
> >bunch of images. That TThread instance can be destroyed in two ways:
> >
> >1) When the loading finishes.
> >2) When the user closes the app while loading.
> >
> >In case 2, I destroy the thread using this code:
> >
> > if Assigned(FMyThread) then
> > begin
> > FMyThread.Terminate;
> > while not FMyThread.Finished do
> > CheckSynchronize(100);
> > FreeAndNil(FMyThread);
> > end;
> >
> >This works ok.
> >
> >Now, in case 1, I thought that I should assign an OnTerminate event to
> >the thread, then destroy it, but it doesn't work as expected. The app
> >gets locked on my thread destroy event:
> >
> > procedure TForm1.Createthread;
> > begin
> > FMyThread := TMyThread.Create;
> > FMyThread.OnTerminate := @ThreadDestroyEvent;
> > FMyThread.Start;
> > end;
> >
> > procedure TForm1.ThreadDestroyEvent(Sender: TObject);
> > begin
> > FMyThread.Free;
> > end;
> >
> > destructor TMyThread.destroy;
> > begin
> > // destroy internal objects
> > inherited destroy; //<-- The app gets locked here!!
> > end;
> >
> >Why is this happening?, am I doing something wrong?.
> >
>
> I don't know whether this will solve your error, but two things of which I
> don't know whether they are known to you:
> 1. Calling "Terminate" will not kill the thread, it just sets the
> "Terminated" property to true, so you must check for yourself inside
> "Execute" whether your Thread should stop
> 2. The event you assigned to "OnTerminate" will only be called if you call
> "DoTerminate" inside the thread (the event will be called using
> Synchronize).
>
> You might also want to take a look at the property "FreeOnTerminate" which
> tells the thread to free itself once "Execute" returns.
>
> Regards,
> Sven
Sven, the event OnTerminate is called. What's wrong is the destruction
of the thread.
FreeOnTerminate is False. I don't want the thread to be destroyed
automatically.
--
Leonardo M. Ramé
http://leonardorame.blogspot.com
More information about the Lazarus
mailing list