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 :D

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:

Code: Alles auswählen

... im Thread
    do while ?
        MeineFunktion()
    enddo
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>