Seite 1 von 1
Thread pausieren [ERLEDIGT]
Verfasst: Mi, 08. Dez 2010 21:33
von Manfred
Hi,
wie lasse ich eigentlich einen Thread pausieren?
Re: Thread pausieren
Verfasst: Mi, 08. Dez 2010 21:45
von Jan
ThreadWait()
Jan
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 6:48
von Manfred
Grrr,
habe es gefunden. Wie blind kann man eigentlich sein?
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 6:54
von Manfred
Aber ob ich das so gebrauchen kann?
Ich möchte einen mit Intervallzeit gestarteten Thread per Pushbutton anhalten um das Ergebnis am Bildschirm anzusehen und dann soll er mit einem Pushbutton wieder weiterlaufen. Ich verstehe Treadwait() irgendwie anders. Das ein Thread auf einen anderen wartet. Das brauche ich in dem Fall nicht.
Naja, ich könnte natürlich auch die Intervallzeit für den Moment extrem hoch setzen. Er wird ja entweder kurz danach wieder gestartet, oder abgebrochen.
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 10:15
von Herbert
Threadwait wird bei dir kaum passen. Threadwait wartet auf den Abschluss eines Threads (bei Zeitangabe sogar nur innerhalb dieser Zeit).
Falls der Pushbutton innerhalb deines Threads ist, der warten soll, dann machs plump: Einfach das Ergebnis in einer modalen Box anzeigen, so fährt das Programm erst wieder dort weiter, wenn du diesen Dialog abgeschlossen hast (ähnlich wie bei JA/NEIN-Frage-Fenster).
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 11:34
von brandelh
Hi,
ich habe eine Auswertungsroutine, die abgebrochen werden kann.
Hier nutze ich eine private variable zum steuern, man könnte auch eine lokale per Parameter
an den Thread (per Referenz) übergeben oder eine exportierte Instanzvariable des Threads,
aber so ist es einfacher:
Code: Alles auswählen
m->Abbruch := .f.
...
do while ! eof() // Im Thread....
...
if m->Abbruch
Thread beenden
du könntest hier einfach eine Wartebedingung einbauen:
Code: Alles auswählen
m->Warten := .f.
...
do while ! eof() // Im Thread....
...
do while m->Warten
sleep(10) // 10 mal pro Sekunde oder weniger ? prüfen
enddo
...
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 11:40
von Manfred
Hm,
das mit der Wartebedingung. Man könnte ja dann einfach den Aufruf ohne Ablauf wieder zurückschicken. Der Thread läuft zwar weiter, aber arbeitet die Funktion nicht ab. Das wäre möglich. In meinem Falle vielleicht sogar eine gute Lösung.
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 14:47
von brandelh
In meinem Beispiel wird der Thread mitten in seiner Verarbeitung angehalten, ohne dass Systemresourcen verschwendet werden
Dennoch ist der Thread genau an der richtigen Stelle zum Weiterarbeiten.
Manfred hat geschrieben:Man könnte ja dann einfach den Aufruf ohne Ablauf wieder zurückschicken. Der Thread läuft zwar weiter, aber arbeitet die Funktion nicht ab.
Ich weiß nicht was du damit meinst, zurückschicken klingt wie beenden, dann läuft aber auch nichts mehr
Wie auch immer, hauptsache du weißt was du tust
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 14:53
von Manfred
ok,
anders ausgedrückt: die Funktion, die der Thread immer wieder aufruft, wir einfach übersprungen durch eine IF Schleife.Der Thread als solcher kann/darf ja ruhig weiterlaufen, er darf bloß die Routine nicht aufrufen. Gestoppt würde der Thread dann durch einen anderen Button.
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 15:20
von Tom
Wenn Dein Thread immer wieder eine Funktion aufruft, die die eigentliche Arbeit leistet, muss diese Funktion nur bei jedem Aufgerufenwerden prüfen, ob z.B. eine statische Variable (oder eine Instanzvariable der abgeleiteten Thread-Klasse, was viel eleganter wäre) gesetzt ist oder nicht. Und wenn sie gesetzt ist, wartet die Funktion, wie Hubert das gezeigt hat, und gibt nichts zurück. Nur wenn die Variable nicht gesetzt ist, macht sie was. Für den Abbruch des Threads, was ein weiterer Schuh wäre, müsste dann die Schleife im Thread selbst eine weitere iVar prüfen. Also, wie gesagt: Eigene Thread-Klasse ableiten, um zwei iVars "lThreadPause", "lThreadAbort" ergänzen, Threadobjekt an Funktion übergeben, Variableninhalte regelmäßig prüfen. ThreadWait() oder Synchronize() sind für diese Geschichte ungeeignet, da sie den aufrufenden Thread betreffen.
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 15:22
von brandelh
Wenn du in dem Thread eine Schleife hast wie diese hier:
musst du halt sicherstellen, dass der Thread nicht sofort wieder weiter in die Schleife geht,
das würde sonst den Rechner richtig belasten:
Code: Alles auswählen
... im Thread
do while ?
if M->Arbeiten // wehe wenn das hier falsch wird ;-)
MeineFunktion()
endif
enddo
besser so:
Code: Alles auswählen
... im Thread
do while ?
if M->Arbeiten // wehe wenn das hier falsch wird ;-)
MeineFunktion()
else
sleep(10)
endif
enddo
wenn aber dein Thread einfach "ausgeht" und nach einem Zeitinterval neu startet,
dann paßt das ohne sleep()
Re: Thread pausieren
Verfasst: Do, 09. Dez 2010 15:24
von Manfred
Jungs,
Danke, ich habe es mit den Threadvars gemacht und bin gerade dabei es zu implementieren, sprich auch zu testen. =D>