Einzelnen Beitrag anzeigen

Andy090778

Registriert seit: 14. Mai 2006
23 Beiträge
 
Delphi 5 Standard
 
#6

Re: Thread sauber Beenden ? Handle ungültig.

  Alt 29. Jan 2008, 23:48
Ich hatte auch schon mal Probleme beim Ausführen von Code nach dem Beenden durch ein Terminate bzw. ein Free.

Mein Fazit:
  • - Ohne WaitFor darf man kein Thread manuell beenden. Klingt logisch, vor allem dann wenn der Thread Daten mit irgendwas anderem syncronisiert. Somit ist sichergestellt, dass alle Syncronized-Beziehungen beendet wurden.
  • - Aufräumarbeiten hab ich strikt in OnTerminated-Ereignis benutzt. Da ich sowieso außerhalb des Threads die Strukturen und Daten bereitstelle, hatte ich da kein Problem. Wenn Du eine Komponente machen möchtest, kannst Du ja trotzdem den Code in eine andere Unit packen.

Hier nochmal die Beschreibung aud Delphi:
Mit WaitFor ermitteln Sie den Wert von ReturnValue, wenn die Ausführung des Thread beendet ist. WaitFor kehrt erst zurück, wenn der Thread beendet ist. Dazu muß der Thread entweder die Methode Execute abschließen oder die Beendigung einleiten, sobald die Eigenschaft Terminated den Wert True annimmt.

Das fette ist der springende Punkt. Ich vermute mal bis die 1000ms Wartezeit vergehen, ist das Terminated Bit schon gesetzt und die internen Daten sind freigegeben. Dann ist auch Dein Handle nicht mehr gültig.

Abhilfe:

Ich würde ganz einfach mal:
Delphi-Quellcode:
    PdhCloseQuery(HQ);
    FreeLibrary(hPDH);
in eine Prozedur verschieben, die Du in der Prozedur Create an OnTerminate hängst.

Und aus
Array[1..4] of TPDHInfo würd ich auch ein Typ machen.

So lass ich zb. in einem Rechnungsprogramm verzögert die Daten aus einer Datenbank lesen und in ein Listview schreiben. Und der Benutzer kann jederzeit durch ESC o.ä. den Vorgang abbrechen.

Andreas
Andreas
  Mit Zitat antworten Zitat