Auf Beendigung von Thread warten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Auf Beendigung von Thread warten

Beitrag von Eclipticon »

Hi,

wenn ich mit Multithreading arbeite, mache ich das meist nach folgendem Schema:

Code: Alles auswählen

type TMyForm: class(TForm)
  // ...
  MyTestThread: TTestThread;
end;
 
procedure TMyForm.Button1Click(Sender:TObject);
begin
  if not Assigned(MyTestThread) then begin
    MyTestThread := TTestThread.Create(True);
    MyTestThread.FreeOnTerminate := False;
    MyTestThread.OnTerminate := @TestThreadTerminate;
    // ...
   MyTestThread.Start;
  end;
end;
 
procedure TMyForm.Button2Click(Sender:TObject);
begin
  if Assigned(MyTestThread) then
    MyTestThread.Terminate;
end;
 
procedure TMyForm.TestThreadTerminate(Sender: TObject);
begin
  if (Assigned(MyTestThread.FatalException) and (MyTestThread.FatalException is Exception)) then
    // ...
  FreeAndNil(MyTestThread);
end;
 
procedure TMyForm.FormDestroy(Sender: TObject);
begin
  // ...
  if Assigned(MyTestThread) then
  begin
    MyTestThread.Terminate;
    while Assigned(MyTestThread) do
      Application.ProcessMessages;
  end;
  //...
end;
Funktioniert auch wunderbar.

Meine Frage ist: Kann ich Application.ProcessMessages zu Verarbeiten der Messages (und damit meins Verstaendnisses nach auch der OnTerminate-Message) auch in einer Konsolenanwendung, einem Systemservice oder aus deinem Thread heraus, der nicht der Main Thread ist, verwenden? Wenn nein, welche Alternativen habe ich?

Danke!

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Auf Beendigung von Thread warten

Beitrag von theo »

Schon mal so probiert?
http://lazarus-ccr.sourceforge.net/docs ... itfor.html

Aber wenn es nur um die Programmbeendung geht, brauchst du mMn nicht unbedingt darauf warten.
MyTestThread.OnTerminate := Nil;
sollte reichen.

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Auf Beendigung von Thread warten

Beitrag von Eclipticon »

theo hat geschrieben:Schon mal so probiert?
http://lazarus-ccr.sourceforge.net/docs ... itfor.html
Dann muesste ich aber das Free aus dem OnTerminate rausnehmen, weil sonst mein Thead schon nil sein koennte, wenn ich WaitFor ausloese ...

Code: Alles auswählen

MyTestThread.Terminate;
MyTestThread.WaitFor;
FreeAndNil(MyTestThread);
 
in Button2Click geht natuerlich auch, aber da Terminate relativ lange brauchen kann (greift in diesem Fall auf Hardware zurueck), ist das nicht ideal.
theo hat geschrieben: Aber wenn es nur um die Programmbeendung geht, brauchst du mMn nicht unbedingt darauf warten.
MyTestThread.OnTerminate := Nil;
sollte reichen.
Ich glaube, ich kann nicht ganz folgen ...

Benutzeravatar
theo
Beiträge: 10867
Registriert: Mo 11. Sep 2006, 19:01

Re: Auf Beendigung von Thread warten

Beitrag von theo »

Eclipticon hat geschrieben:Ich glaube, ich kann nicht ganz folgen ...
Warum willst du überhaupt auf den Thread warten, wenn du das Prog. sowieso beendest?

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Auf Beendigung von Thread warten

Beitrag von Eclipticon »

theo hat geschrieben:
Eclipticon hat geschrieben:Ich glaube, ich kann nicht ganz folgen ...
Warum willst du überhaupt auf den Thread warten, wenn du das Prog. sowieso beendest?
Weil ich gern ein paar Dinge sauber beenden moechte (z.B. Ressourcen freigeben).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Auf Beendigung von Thread warten

Beitrag von mschnell »

Dann kannst Du auch myThread.Waitfor verwenden und danach myThread.Free machen. Oder ?

(myThread.FreeOnTerminate darf dann natürlich nicht gesetzt sein. )

-Michael

Antworten