Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen ob Thread noch läuft (https://www.delphipraxis.net/85003-pruefen-ob-thread-noch-laeuft.html)

sirius 25. Jan 2007 07:45

Re: Prüfen ob Thread noch läuft
 
Zitat:

Zitat von Schwedenbitter
Ich habe jetzt auch die Quelle für die Exception gefunden. Allerdings weiß ich nicht, woran es wirklich liegt.
Ich hatte nach entsprechendem Quelltext aus dem Forum versucht, eine ProgressBar in eine Statusbar zu integrieren. Ich hatte zuerst die ProgressBar völlig gelöscht. Und siehe da, der Fehler trat nicht mehr auf. Anschließend ließ ich die ProgressBar drin. Allerdings separat und nicht mehr integiert. Der Fehler trat wieder auf. Jetzt ist sie ganz raus. Aber der Benutzer sieht jetzt leider nicht mehr, wie weit das Programm fortgeschritten ist. Schade.

:gruebel:
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...

Schwedenbitter 25. Jan 2007 08:00

Re: Prüfen ob Thread noch läuft
 
Zitat:

Zitat von sirius
:gruebel:
Könnte es sein, dass du die Progressbar ohne synchroinize aufrufst?

Ja, ich habe so drauf zugegriffen, wie ich es immer getan habe. Ich habe schon in mehreren Programmen eine ProgressBar benutzt, ohne jemals Fehlermeldungen gehabt zu haben. Deshalb ging ich (zunächst) davon aus, dass es an der Integration in die StatusBar liegen würde.

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.

sirius 25. Jan 2007 08:12

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;

Schwedenbitter 25. Jan 2007 23:30

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.

shmia 26. Jan 2007 13:20

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

sirius 26. Jan 2007 13:39

Re: Prüfen ob Thread noch läuft
 
Zitat:

Zitat von shmia
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

:gruebel: Hmm, aber es gibt doch keinen anderen thread, der auf meine Variable zugreift?

Luckie 26. Jan 2007 14:06

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.

shmia 26. Jan 2007 14:08

Re: Prüfen ob Thread noch läuft
 
Zitat:

Zitat von sirius
:gruebel: Hmm, aber es gibt doch keinen anderen thread, der auf meine Variable zugreift?

Na wenn's nur einen Thread gibt, dann braucht man auch keinen Zähler. Aber bei mehr als einem Thread kanns passieren, dass der Assemblerbefehl DEC in der Mitte unterbrochen wird.
Greift dann ein weiterer Thread auf die Variable zu, wird's gefährlich denn das erzeugt bösartige und nicht reproduzierbare Bugs.

Daimonion 9. Feb 2009 10:34

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?

himitsu 9. Feb 2009 11:25

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.
Seite 2 von 3     12 3      

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