AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Thread noch läuft

Ein Thema von Schwedenbitter · begonnen am 24. Jan 2007 · letzter Beitrag vom 9. Feb 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Prüfen ob Thread noch läuft

  Alt 25. Jan 2007, 07:45
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.

Könnte es sein, dass du die Progressbar ohne synchroinize aufrufst?


Edit: Da war ein Formatfehler Man sollte doch öfter mal den Vorschau-Button wählen...
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Prüfen ob Thread noch läuft

  Alt 25. Jan 2007, 08:00
Zitat von sirius:

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.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Prüfen ob Thread noch läuft

  Alt 25. Jan 2007, 08:12
[/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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: Prüfen ob Thread noch läuft

  Alt 25. Jan 2007, 23:30
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.
Alex Winzer
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#15

Re: Prüfen ob Thread noch läuft

  Alt 26. Jan 2007, 13:20
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Prüfen ob Thread noch läuft

  Alt 26. Jan 2007, 13:39
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
Hmm, aber es gibt doch keinen anderen thread, der auf meine Variable zugreift?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Prüfen ob Thread noch läuft

  Alt 26. Jan 2007, 14:06
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#18

Re: Prüfen ob Thread noch läuft

  Alt 26. Jan 2007, 14:08
Zitat von sirius:
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Daimonion
Daimonion

Registriert seit: 4. Dez 2006
Ort: Vöhrenbach
15 Beiträge
 
#19

Re: Prüfen ob Thread noch läuft

  Alt 9. Feb 2009, 10:34
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?
Thomas
Zitat Stromberg S03E08 - Erika:
"So...selbst die Capitolmatratze, die hier auf jedem Karosseplan umgerutscht ist, was will sie von mir? Zahlen. Aber so ist das. Als Chef in meiner Position, da bist du so einsam wie...Gott."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#20

Re: Prüfen ob Thread noch läuft

  Alt 9. Feb 2009, 11:25
jupp, kannst du ... einfach über tmythread.isrunning ,
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz