Thread pausieren [ERLEDIGT]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Thread pausieren [ERLEDIGT]

Beitrag von Manfred »

Hi,

wie lasse ich eigentlich einen Thread pausieren?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag von Jan »

ThreadWait()

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Thread pausieren

Beitrag von Manfred »

Grrr,

habe es gefunden. Wie blind kann man eigentlich sein?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Thread pausieren

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag 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).
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag 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
    ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Thread pausieren

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag 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
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Thread pausieren

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Thread pausieren

Beitrag 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() ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Thread pausieren

Beitrag von Manfred »

Jungs,

Danke, ich habe es mit den Threadvars gemacht und bin gerade dabei es zu implementieren, sprich auch zu testen. =D>
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten