![]() |
Re: Prüfen ob Thread noch läuft
Zitat:
Könnte es sein, dass du die Progressbar ohne synchroinize aufrufst? Edit: Da war ein Formatfehler :drunken: Man sollte doch öfter mal den Vorschau-Button wählen... |
Re: Prüfen ob Thread noch läuft
Zitat:
Was muss ich für den Aufruf mit synchronize tun? Ich würde gern die StatusBar wieder drin haben; ohne Fehlermeldung versteht sich. Entschuldigt die blöde Frage. |
Re: Prüfen ob Thread noch läuft
[/delphi]Jede Interaktion mit dem Hauptthread muss mit synchronize erfolgen.
Und damit erst recht jeder Zugriff auf VCL-Komponenten. Am Besipiel progressbar (dies gilt für alle anderen Variablen, Komponenten aus dem Haptthread genauso):
Delphi-Quellcode:
type
tmythread = class(TThread) private { Private-Deklarationen } incProgressbar:integer; protected procedure Execute; override; //in Execute kommen nur Sachen rein, die definitv nie auf Komponenten oder Variablen anderer Threads zugreifen procedure updateProgressbar; //immer eigene Methoden für solche "Querzugriffe" public end; implementation procedure tmyThread.UpdateProgressbar; begin //hier möglichst zeitsparend (wenig befehle) arbeiten, sonst bringt der ganze Thread nix progressbar.stepby(incProgressbar); end; procedure tmythread.Execute; begin //... incprogressbar:=5; synchronize(updateprogressbar); //Variablen kannst du am einfachsten über die private Deklaration des ThreadObjektes übergeben //... end; |
Re: Prüfen ob Thread noch läuft
Vielen, vielen Dank!
Ich habe jetzt meinen Quellcode gesäubert. Die Fehlermeldung ist weg und selbst beim wirklich lahmen VPN kann ich jetzt das Fenster bewegen, als ob ich auf meiner Festplatte arbeiten würde. Meine Fragen sind jetzt alle geklärt. |
Re: Prüfen ob Thread noch läuft
Wichtiger Hinweis: man sollte InterlockedDecrement aus Unit Windows verwenden
Delphi-Quellcode:
Dec(ThreadsRunning); // nicht Threadsafe !!!
if ThreadsRunning=0 then ... if InterlockedDecrement(ThreadsRunning) = 0 then ... // so ist's richtig |
Re: Prüfen ob Thread noch läuft
Zitat:
|
Re: Prüfen ob Thread noch läuft
Warum arbeitest du nicht mit Ereignissen? Wenn ein Thread gestartet wird, wird ein Ereignis ausgelöst und wenn ein Thread sich beendet, wird ein Ereignis ausgelöst. So kannst du in deinem Formular immer schön mitzählen.
|
Re: Prüfen ob Thread noch läuft
Zitat:
Greift dann ein weiterer Thread auf die Variable zu, wird's gefährlich denn das erzeugt bösartige und nicht reproduzierbare Bugs. |
Re: Prüfen ob Thread noch läuft
Hallo
Ich habe noch eine Frage zu Sirius Beispiel im zweiten Post. Die Funktion is running hat ja das class attribut vorne dran. Soweit ich weiß wird die Funktion dadurch statisch gemacht. Kann ich dann von außerhalb diese Funktion aufrufen, ohne dass ich die Threadklasse instanziiert habe? |
Re: Prüfen ob Thread noch läuft
jupp, kannst du ... einfach über tmythread.isrunning , :angel:
wobei ich diese globale Variable noch in eine Klassenvariable umwandeln würde
Delphi-Quellcode:
type
tmythread = class(TThread) private { Private-Deklarationen } class var running: integer = 0; protected procedure Execute; override; public class function isrunning: boolean; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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