Thread warten lassen [Erledigt]
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen
Hubert,
nichts anderes erzähle ich die ganze Zeit.
Jan
nichts anderes erzähle ich die ganze Zeit.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen
Wenn du in Funktion B solange wartest, bis der Thread beendet ist, dann wird sich das Programm so verhalten wie du es erwartest:
Wenn ja könntest du mir doch nicht zustimmen und gleichzeitig den Fehler nicht erkennen ... ich versteh nur noch Bahnhof.
Code: Alles auswählen
Function B()
local oThread
oThread := Thread():new()
oThread:start( ??? )
oThread:synchronize(0) // hier wird die Funktion B - also der aktuelle Thread angehalten, bis oThread fertig / beendet ist.
return
Achtung: beim Aufruf von :synchronize() darf kein Zeitintervall durch :setInterval() definiert sein. Andernfalls besteht die Möglichkeit, daß :synchronize() nicht mehr beendet werden kann.
liest du eigentlich was ich schreibe ?JAN hat geschrieben:Hubert,
nichts anderes erzähle ich die ganze Zeit.
Jan
Wenn ja könntest du mir doch nicht zustimmen und gleichzeitig den Fehler nicht erkennen ... ich versteh nur noch Bahnhof.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen
Hubert,
nein, nein nein! Warum sollte ich Thread B anhalten wollen??? Das macht keinen Sinn. ICH MUSS THREAD A ANHALTEN!!!
Und Du hast Recht: Ich habe teilweise nicht den Code gelesen. Wenn ich an dem begleitenden Text gesehen habe, daß das der falsche Ansatz ist, dann habe ich mir das erspart. Mea culpa. Ich stehe dazu.
Jan
nein, nein nein! Warum sollte ich Thread B anhalten wollen??? Das macht keinen Sinn. ICH MUSS THREAD A ANHALTEN!!!
Und Du hast Recht: Ich habe teilweise nicht den Code gelesen. Wenn ich an dem begleitenden Text gesehen habe, daß das der falsche Ansatz ist, dann habe ich mir das erspart. Mea culpa. Ich stehe dazu.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen
Hallo Jan,
lies doch in der Beschreibung der Hilfe nach, laut der müsste so wie ich das geschrieben habe der Thread B den Thread A anhalten.
Aber ich kann es ja nochmal probieren ...
lies doch in der Beschreibung der Hilfe nach, laut der müsste so wie ich das geschrieben habe der Thread B den Thread A anhalten.
Aber ich kann es ja nochmal probieren ...
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen
Hubert,
weißt Du eigentlich, wie viele Stunden ich heute die Hilfefunktionen und die Beispiele und diverse pdf von Alaska gelesen habe? Und ich versucht habe, die darin aufgeführten Wege umzusetzen? Entweder ist das zu verkompliziert erläutert, oder ich bin begriffstutzig, oder denke zu kurz, oder eine Kombination aus allem. Jedenfalls habe ich es bis jetzt nicht ans laufen bekommen.
Jan
weißt Du eigentlich, wie viele Stunden ich heute die Hilfefunktionen und die Beispiele und diverse pdf von Alaska gelesen habe? Und ich versucht habe, die darin aufgeführten Wege umzusetzen? Entweder ist das zu verkompliziert erläutert, oder ich bin begriffstutzig, oder denke zu kurz, oder eine Kombination aus allem. Jedenfalls habe ich es bis jetzt nicht ans laufen bekommen.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen
Hallo Jan,
zunächst eignet sich deine Aufgabe nicht für Threads, da alles viel zu abhängig voneinander ist !
Zudem ist Threadsteuerung nicht ganz einfach zu verstehen, ich japse auch immer damit
Nun sieh dir den geänderten Code an. Viel wurde nicht geändert, aber die UHR des Threads läuft nun 10 Sekunden,
dann hält sie an und es geht im Hauptprogramm weiter.
PS: es kommt auf die Reihenfolge an
Der weiterlaufende Thread blockiert mit seiner Methode Syncronize(0) den/die anderen Threads
zunächst eignet sich deine Aufgabe nicht für Threads, da alles viel zu abhängig voneinander ist !
Zudem ist Threadsteuerung nicht ganz einfach zu verstehen, ich japse auch immer damit
Nun sieh dir den geänderten Code an. Viel wurde nicht geändert, aber die UHR des Threads läuft nun 10 Sekunden,
dann hält sie an und es geht im Hauptprogramm weiter.
PS: es kommt auf die Reihenfolge an
Der weiterlaufende Thread blockiert mit seiner Methode Syncronize(0) den/die anderen Threads
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "inkey.ch"
procedure main()
cls
@ 1,1 say "Start von Hauptprogramm - ESC = Ende"
StarteThread()
// die Funktion ist zu Ende, der Thread nicht !
do while inkey(1) # K_ESC
@10,1 say "Im Hauptprogramm "+time()
enddo
quit // nur QUIT schließt alle offenen Threads !
return
function StarteThread()
local oThread
oThread := Thread():new()
@ 6,1 say "Start von Funktion StarteThread() "+time()
@ 7,1 say "Hier zeigt der Thread die Uhrzeit an solange er läuft:" color "W+/R"
oThread:start( "showTime", 7, 60 )
oThread:synchronize(0)
@ 8,1 say "Ende von Funktion StarteThread() "+time()
return nil
PROCEDURE ShowTime( nRow, nCol )
local x := 10
DO WHILE x > 0
DispOutAt( nRow, nCol, Time() )
Sleep(100)
x--
ENDDO
RETURN
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen
Vielleicht seh ich vor lauter Codegewusel heute nicht mehr klar. Aber wo in Deinem Beispiel wird der erste Thread gestoppt, bis ein zweiter Thread abgearbeitet wird?
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen
Du solltest eventuell erstmal drüber schlafen ... und oben meine ROTEN nachträglich eingefügten Bemerkungen lesen
oThread:start( "showTime", 7, 60 ) // Thread B startet
oThread:synchronize(0) // Thread B blockiert den/die anderen Threads, bis ER FERTIG IST !
ähnlich wie beim Browser
oBrowse::stabilize() // Browser zur Anzeige zwingen.
Code: Alles auswählen
function StarteThread()
local oThread
oThread := Thread():new()
@ 6,1 say "Start von Funktion StarteThread() "+time()
@ 7,1 say "Hier zeigt der Thread die Uhrzeit an solange er läuft:" color "W+/R"
oThread:start( "showTime", 7, 60 )
oThread:synchronize(0)
@ 8,1 say "Ende von Funktion StarteThread() "+time()
return nil
oThread:synchronize(0) // Thread B blockiert den/die anderen Threads, bis ER FERTIG IST !
ähnlich wie beim Browser
oBrowse::stabilize() // Browser zur Anzeige zwingen.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen
Eventuell wäre es nützlich, beide Beispiele von mir zu speichern, kompilieren, Ergebnis ansehen oder gar debuggen ...
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen
Ich hab das jetzt anders gelöst. Sicher nicht so, wie Alaska sich das gedacht hat, sicher auch nicht sonderlich elegant, aber so klappt es jetzt.
Ich erstelle in der Main eine
In Thread A sieht die Schleife jetzt so aus:
Und ganz am Ende von Funktion B steht
Funktioniert wie gesagt genau so, wie ich es brauche. Und ist flott genug.
Jan
Ich erstelle in der Main eine
Code: Alles auswählen
PUBLIC lRunning := .F.
Code: Alles auswählen
For i := 1 To nWasAuchImmer
MEMVAR->lRunning := .T.
FunktionB()
Do While MEMVAR->lRunning := .T.
Sleep(1)
EndDo
Next
Code: Alles auswählen
MEMVAR->lRunning := .f.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hallo Jan,
trotz des Holzhammers solltest du dir meine letzten Zeilen ansehen
Es ist nicht leicht zu verstehen, dass man den Thread den man laufen lassen will mit Synchronize(0) beauftragt, den Rest des Programmes anzuhalten, aber so ist es eben
Die Hilfe könnte in dem Punkt besser sein.
In meinem Beispiel blockiere ich die Funktion B bis der Thread B fertig ist.
Die Funktion B blockiert hierdurch die For Next Schleife und gut ist es.
trotz des Holzhammers solltest du dir meine letzten Zeilen ansehen
Es ist nicht leicht zu verstehen, dass man den Thread den man laufen lassen will mit Synchronize(0) beauftragt, den Rest des Programmes anzuhalten, aber so ist es eben
Die Hilfe könnte in dem Punkt besser sein.
In meinem Beispiel blockiere ich die Funktion B bis der Thread B fertig ist.
Die Funktion B blockiert hierdurch die For Next Schleife und gut ist es.
Gruß
Hubert
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9373
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Code: Alles auswählen
o:=thread():new()
o:start({||ThreadB()})
o:Synchronize(0)
Funzt einwandfrei, wie wir im Osten sagen.
Herzlich,
Tom
Tom
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Tja, was soll ich dazu sagen? Wenn ich in Thread B ein oThread:synchronize(0) enbaue, dann passiert das hier (hatte ich heute früh schon):
JanMitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hi,
in der Funktion, die den ThreadB startet muss das rein, denn diese Funktion wird im aufrufenden Thread ausgeführt, auch wenn es um den gestarteten Thread geht.
Ich habe doch die Beispiele oben, direkt nach oThread:start() kommt oThread:synchronize(0)
in der Funktion, die den ThreadB startet muss das rein, denn diese Funktion wird im aufrufenden Thread ausgeführt, auch wenn es um den gestarteten Thread geht.
Ich habe doch die Beispiele oben, direkt nach oThread:start() kommt oThread:synchronize(0)
Gruß
Hubert
Hubert
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hallo Jan,
im Anhang findest du 3 Beispiele, die meiner Meinung nach dein Problem vollständig mit unterschiedlichen Einsätzen lösen.
Ich habe Signal und Synchronize in den Beispielen verwendet und versucht, die Beispiele so einfach wie möglich zu machen, damit diese leicht verstanden werden können.
Du kannst ja das wählen, was dir am Besten gefällt.
im Anhang findest du 3 Beispiele, die meiner Meinung nach dein Problem vollständig mit unterschiedlichen Einsätzen lösen.
Ich habe Signal und Synchronize in den Beispielen verwendet und versucht, die Beispiele so einfach wie möglich zu machen, damit diese leicht verstanden werden können.
Du kannst ja das wählen, was dir am Besten gefällt.
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread warten lassen [Erledigt]
hi,
warum macht ihr das alle so "kompliziert" ?egal wie ich die Parameter übergebe, "so" bekomme ich nichts "zurück".
was wir doch haben wollen ist eine "Reaktion" des 2nd Thread. Klar ist Signal() dafür gedacht aber auch das "passt" nicht immer ...ich gehe mal davon aus das ein Thread (als "Fenster" ) so aussieht.wenn ich oThread:start() aber "so" aufrufe passiert "nichts" ... oDialog1 und oDialog2 sind "leer".
also der nächste Versuch per Referenze @aber auch das bringt nichts.
auch wenn man die Parameter in ein Array "packt" bleibt es "leer".
Quiz Frage : wie wird oThread:start() nun "richtig" angewendet so das ich oDialog1 "zurück" bekomme ? ***
wer das weiss braucht weder Signal() noch meine 3th Lösung : Userdef Event.
*** klar hab ich die Lösung, aber ich will mal abwarten ob jemand anderes auch auf die Lösung kommt.
@Jan : da ich dir ein Demo geschickt habe bitte ich dich die Lösung noch nicht zu verraten
warum macht ihr das alle so "kompliziert" ?
Code: Alles auswählen
LOCAL oThread := Thread():new()
LOCAL a,b,c
a := ""
b := ""
c := {""}
oThread:start( "showTime", a,@b,c )
also das ist die "ganz harte" Methode ...Jan hat geschrieben:PUBLIC lRunning := .F.
...
Do While MEMVAR->lRunning := .T.
was wir doch haben wollen ist eine "Reaktion" des 2nd Thread. Klar ist Signal() dafür gedacht aber auch das "passt" nicht immer ...
Code: Alles auswählen
LOCAL oMain
LOCAL oDialog1 // hier schon initialisieren
LOCAL oDialog2 // könnte auch ein {} sein
oMain := XbpDialog()...
oThread1 := Thread():new()
oThread2 := Thread():new()
oThread1:start( "tudies", oDialog1 ,oStat1)
oThread2:start( "tudas", oDialog2 ,oStat2)
Code: Alles auswählen
PROCEDURE tudies(oDlg1,oStat1)
LOCAL nEvent, mp1, mp2, oXbp
LOCAL lExit := .F.
oDlg1 := XbpDialog():new(oStat1 ,, {0,0}, {200,100} )
oDlg1:title := "Thread 1"
oDlg1:close := {|| lExit := .T. }
oDlg1:create()
nEvent := 0
DO WHILE !lExit
nEvent := AppEvent( @mp1, @mp2, @oXbp, 100 )
DO CASE
//
// hier die Abfragen
//
OTHERWISE
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDCASE
ENDDO
oDlg1:destroy()
RETURN
also der nächste Versuch per Referenze @
Code: Alles auswählen
oThread1:start( "tudies", @oDialog1 ,oStat1)
oThread2:start( "tudas", @oDialog2 ,oStat2)
auch wenn man die Parameter in ein Array "packt" bleibt es "leer".
Quiz Frage : wie wird oThread:start() nun "richtig" angewendet so das ich oDialog1 "zurück" bekomme ? ***
wer das weiss braucht weder Signal() noch meine 3th Lösung : Userdef Event.
Code: Alles auswählen
#define xbeE_Raushier1 xbeP_User+1
#define xbeE_Raushier2 xbeP_User+2
PROCEDURE MAIN
oThread1:start( "tudies ... oDialog1")
oThread2:start( "tudas ... oDialog2")
...
DO WHILE !lExit
nEvent := AppEvent( @mp1, @mp2, @oXbp )
DO CASE
CASE nEvent = xbeE_Raushier1
PostAppEvent(xbeE_Raushier1,,,oDialog1)
CASE nEvent = xbeE_Raushier2
PostAppEvent(xbeE_Raushier2,,,oDialog2)
PROCEDURE tudies(oDlg1,oStat1)
...
DO WHILE !lExit
nEvent := AppEvent( @mp1, @mp2, @oXbp, 100 )
DO CASE
CASE nEvent = xbe_None
// warten timeout 4th Parameter
CASE nEvent = xbeE_Raushier1
...
PROCEDURE tudas (oDlg2,oStat2)
...
PostAppEvent(xbeE_Raushier)
RETURN
@Jan : da ich dir ein Demo geschickt habe bitte ich dich die Lösung noch nicht zu verraten
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Ich möchte mich bei Euch bedanken für all de Mühe, die Ihr euch gemacht habt. Aber anscheinend drücke ich mich so verquer aus, das auch nach mehrfachem Wiederholen niemand versteht, wie der Programmablauf eigentlich ist. Oder niemand liest richtig mit, oder meine Ablaufstruktur ist so ungewöhnlich, das niemand dahinter steigt. Auf jeden Fall passt leider keines der Beispiele auf meine Vorgehensweise. Oder ich müsste das gesamte Programm umschreiben, was ich nicht kann, ohne die gesamte Ablaufstruktur des kompletten Programms zu zerstören.
Andreas: Wir können das ja beim nächsten XUG-Treffen besprechen.
Da ich für mich eine Lösung gefunden habe (auch wenn es die Holzhammer-Methode ist), ist der Fall für mich ersteinmal erledigt. Womit ich selbstverständlich die Diskussion nicht abwürgen möchte! Die ist ja durchaus sehr informativ und hilft, die Vorgehensweise bei Threads besser zu verstehen. Also diskutiert das gerne weiter, aber habt bitte Verständnis dafür, das ich mich daraus zurückziehe.
Jan
Andreas: Wir können das ja beim nächsten XUG-Treffen besprechen.
Da ich für mich eine Lösung gefunden habe (auch wenn es die Holzhammer-Methode ist), ist der Fall für mich ersteinmal erledigt. Womit ich selbstverständlich die Diskussion nicht abwürgen möchte! Die ist ja durchaus sehr informativ und hilft, die Vorgehensweise bei Threads besser zu verstehen. Also diskutiert das gerne weiter, aber habt bitte Verständnis dafür, das ich mich daraus zurückziehe.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hallo Jan,
dein Holzhammer ist völlig OK, solange dein Programm genau diesen Ablauf hat.
Warum du aber meinst mein obiges zweites Beispiel würde nicht passen verstehe ich nicht.
Du läßt den Code in Thread B deine PUBLIC Variable steuern, weil die Funktion B nicht auf dessen Ende wartet.
Ich habe durch Einfügen einer Zeile (nach dem oThread:START()) die Funktion B auf das Ende von Thread B warten lassen, bevor diese sich beendet:
auf den ersten Blick sieht das blöd aus: 'oThread steuert den Thread B und soll nun den Thread A von Funktion B aufhalten ?'
aber wenn man bedenkt, dass diese Funktion b() und die enthaltene lokale Variable oThread sich selbst ja in Thread A befinden,
wird klarer, warum der Aufruf in Thread A auf die Steuervariable oThread:synchronize(0) von Thread B so wirkt, wie du es brauchst.
Der Thread A meldet an B, dass dieser endlos Zeit hat um seine Arbeit zu erledigen und erst das Ende an den Aufruf in Thread A zurückgibt.
Thread A führt diese Zeile aus, bis die Methode oThread:synchronize(0) von Thread B beendet wird.
Es ist ein bischen wie wenn man "neben sich selbst steht"
dein Holzhammer ist völlig OK, solange dein Programm genau diesen Ablauf hat.
Warum du aber meinst mein obiges zweites Beispiel würde nicht passen verstehe ich nicht.
Du läßt den Code in Thread B deine PUBLIC Variable steuern, weil die Funktion B nicht auf dessen Ende wartet.
Ich habe durch Einfügen einer Zeile (nach dem oThread:START()) die Funktion B auf das Ende von Thread B warten lassen, bevor diese sich beendet:
Code: Alles auswählen
function b()
local oThread := Thread():new()
oThread:start( ? )
oThread:synchronize(0)
return
aber wenn man bedenkt, dass diese Funktion b() und die enthaltene lokale Variable oThread sich selbst ja in Thread A befinden,
wird klarer, warum der Aufruf in Thread A auf die Steuervariable oThread:synchronize(0) von Thread B so wirkt, wie du es brauchst.
Der Thread A meldet an B, dass dieser endlos Zeit hat um seine Arbeit zu erledigen und erst das Ende an den Aufruf in Thread A zurückgibt.
Thread A führt diese Zeile aus, bis die Methode oThread:synchronize(0) von Thread B beendet wird.
Es ist ein bischen wie wenn man "neben sich selbst steht"
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14659
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Moin Hubert,
wenn ich das mache wie in Deinem Codebeispiel, bekomme ich die Fehlermeldung, die ich weiter oben gepostet habe.
Jan
wenn ich das mache wie in Deinem Codebeispiel, bekomme ich die Fehlermeldung, die ich weiter oben gepostet habe.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Ich hatte aber schon erwähnt, dass das oThread:synchronize(0) nicht im Thread B, sondern in der Funktion B - also im Thread A stehen mussWenn ich in Thread B ein oThread:synchronize(0) enbaue, dann passiert das hier (hatte ich heute früh schon):
Wie auch immer, es bestätigt sich meine Aussage, dass wir - zumindest ein Gerüst - deines Quellcodes sehen müssten um dir helfen zu können.
Solange dein Programm diesen Prozess nur einmal startet, geht das mit der Public gut.
Ein MDI Ansatz (also mehr als ein Thread A zur gleichen Zeit) mit einer Public wird hingegen immer scheitern,
weil man einfach nicht weiß, welcher Thread gerade was macht.
Du könntest aber statt der PUBLIC in der MAIN auch eine LOCAL in Thread A erstellen und diese als Parameter per Referenz (@Beendet) an die Funktionen und Threads übergeben.
Diese Lösung wäre dann auch für MDI geeignet.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Thread warten lassen [Erledigt]
aber nur wenn du es in o:Start() auch "richtig" übergibst sonst "wirkt" auch per Referenz nicht.brandelh hat geschrieben:Du könntest aber statt der PUBLIC in der MAIN auch eine LOCAL in Thread A erstellen und diese als Parameter per Referenz (@Beendet) an die Funktionen und Threads übergeben.
Diese Lösung wäre dann auch für MDI geeignet.
Code: Alles auswählen
PROCEDURE Main
LOCAL oThread := Thread():new()
LOCAL nRecno := 0
LOCAL nKey
CLS
oThread:setInterval(100)
//
// so geht es nicht per Referenz
//
oThread:Start( "Test1",@nRecno )
DO WHILE .T.
nKey := INKEY(1)
? STR(nRecno)
IF nKey = 27
EXIT
ENDIF
ENDDO
RETURN
PROCEDURE Test1(nRecno)
nRecno ++
RETURN
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
das hatte ich total vergessen, ich übergebe Objekte (meist SELF, also das Fenster).laut Handbuch hat geschrieben:Der Referenzoperator wird bei der Methode :start() ignoriert.
Wenn ich im Thread dann oWin:SatzAnzahlAnzeige := nWert setze, wird dies auch sauber im Fenster angezeigt.
Auch das Abbruchflag (iVar des Fensters) kann ich während des Laufs, außen auf .t. setzen und im Thread wird oWin:Abbruch ? abgefragt und reagiert.
Ich mag keine Quiz-Fragen, vermute aber mal du meinst ein Objekt
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2828
- Registriert: Fr, 10. Feb 2006 9:51
- Wohnort: Aachen
- Hat sich bedankt: 259 Mal
- Danksagung erhalten: 12 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hallo Jimmy,
so kann man Dir nicht helfen!
Du mußt schon genau sagen, welches Problem Du hast!
Uli
so kann man Dir nicht helfen!
Du mußt schon genau sagen, welches Problem Du hast!
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Thread warten lassen [Erledigt]
Hallo Uli,
Jimmy hat hier kein Problem, das hatte JAN.
Jimmy liebt aber Quiz-Fragen, er fragt uns
Jimmy hat hier kein Problem, das hatte JAN.
Jimmy liebt aber Quiz-Fragen, er fragt uns
Gruß
Hubert
Hubert