![]() |
Auf Thread Ende reagieren aber wie???
Guten Tag,
mein Programm führt mehrer Threads (ca. 60) aus, um den Onlinestatus mehrerer Computer zu prüfen. Funktioniert auch wunderbar. Nun möchte ich aber wissen wenn alle Threads fertig abgearbeitet sind. Kenne mich mit dem Thema nicht so aus und weiß nicht wirklich wie ich es umsetzen kann. Wäre für jede Unterstützung dankbar. Mein Thread Unit:
Delphi-Quellcode:
Aufruf aus dem Hauptprogramm
procedure MyThread.Execute;
begin try { Thread-Code hier einfügen } if IsHostAlive(Server) = True then begin if AppStart = True then frm_main.lv_server.Items[id].ImageIndex := 1 //Server Online else if status = 1 then frm_main.lv_server.Items[id].ImageIndex := 1 //Server Online else begin frm_main.lv_server.Items[id].ImageIndex := 1; //Server Online ShowMessage('Server Online'); end; end else if AppStart = True then frm_main.lv_server.Items[id].ImageIndex := 2 //Server Offline else if status = 2 then frm_main.lv_server.Items[id].ImageIndex := 2 //Server Online else begin frm_main.lv_server.Items[id].ImageIndex := 2; //Server Online ShowMessage('Server Offline'); end; except on e: exception do begin // mache hier irgendetwas mit dem Fehler. end; end; end;
Delphi-Quellcode:
Schon mal Danke im voraus.
procedure Tfrm_main.ServerOnlineCheck(AppStart : Boolean);
var Thread : MyThread; i : Integer; begin for i := 0 to lv_server.Items.Count - 1 do begin // Anwendung aktualiseren Application.ProcessMessages; Thread := MyThread.Create(True); Thread.Server := lv_server.Items[i].Caption; Thread.id := i; Thread.status := lv_server.Items[i].ImageIndex; Thread.AppStart := AppStart; Thread.FreeOnTerminate := True; Thread.Resume; end; lbl_overview_servercheck.Caption := FormatDateTime('dd. mmmm yyyy hh:nn:ss',now) end; Gruß, Sven |
Re: Auf Thread Ende reagieren aber wie???
Hi Sven,
Eins vorneweg: VCL-Dialoge und -Komponenten dürfen nicht innerhalb eines Threads aufgerufen werden. Zu Deinem Problem: Du merkst Dir im Hauptprogramm, welche Threads gestartet wurden, am Besten mit einer Liste. Im OnTerminate-Ereignis des Threads entfernst der Thread sich selbst aus der Liste. Ist die Liste leer, sind alle Threads abgearbeitet. Tipp zum Umsetzen: a) Beschäftige Dich mit der Unit SyncObjs, und der Klasse 'TCriticalSection' b) Suche die Klasse TThreadList und verwende sie Denn wenn mehrere Threads gleichzeitig auf die Liste zugreifen, um sich zu löschen, kommt es garantiert zu Mehrfachzugriffen und damit zu nicht reproduzierbaren Fehlern. Mun muss also Schreibzugriffe auf gemeinsam genutzte Resourcen (hier: die Liste) schützen, sodaß nur ein Thread auf die Liste zugreifen kann... |
Re: Auf Thread Ende reagieren aber wie???
Die Threads haben ein Ereignis: OnTerminate.
Dieses könntest du nutzen. |
Re: Auf Thread Ende reagieren aber wie???
Entweder so, oder du aktivierst FreeOnTerminate und überschreibst den Destructor Destroy.
|
Re: Auf Thread Ende reagieren aber wie???
aber die "Destructor Destroy" wird nicht im VCL Thread Context aufgrufen.
OnTerminate schon, somit brauchst du das nicht selbst zu Syncronisieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz