Threads und Rückgabewerte [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Threads und Rückgabewerte [erledigt]

Beitrag von Wolfgang Ciriack »

Hallo an alle,
ist es möglich, von einem Thread einen Rückgabewert zu erhalten (z.B. .T./.F.) ?
Ich dachte, ich könnte beim Thread:start("Meine_Funktion", aM, cM, lM, @retw) auch ein Parameter per Referenz übergeben, und aus dem Thread retw beschreiben, aber das klappt irgendwie nicht.
Viele Grüße
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Threads und Rückgabewerte

Beitrag von georg »

Hallo, Wolfgang -


der Thread läuft unabhängig von Deiner startenden Funktion, und letztere "wartet" ja auch nicht auf den Thread.

Du kannst aber aus dem Thread heraus eine Nachricht an einen anderen Thread schicken. Du benötigst ein Objekt aus einem anderen Thread als "Anker", an den Du eine Notification schickst.

Wenn ich aus einem Browse einen Datensatz bearbeite, passiert das bei mir in einem separaten Thread. Wenn die Bearbeitung des Datensatzes beendet ist, wird eine Nachricht an den Event-Loop des Browse gesendet, damit dieser sich aktualisieren kann. Da sieht etwa so aus:

Code: Alles auswählen

oThread:start("MeinEditWindow", p1, p2, p3, p4, oBro)
...
PostAppEvent(xbeP_User_notify, aP1, nP2, oBro)
Da oBro sich in einem anderen Thread befindet, schlägt das Event dort auf. xbeP_User_notify ist übrigens selbst definiert, d.h. es findet sich nicht in AppEvent.ch.

Im Event-Loop des Browse steht dann unter anderem

Code: Alles auswählen

CASE nEvent == xbeP_User_notify
   ... // Aktualisieren des Browse
Vielleicht hilft Dir das ja, eine für Deine Anforderung adäquate Lösung zu erstellen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Threads und Rückgabewerte

Beitrag von brandelh »

und du kannst einen local Parameter per Referenz übergeben.
Dieser Wert kann dann laufend einen Wert oder Status austauschen (von beiden Seiten zugreifbar)
Gruß
Hubert
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: Threads und Rückgabewerte

Beitrag von Sören »

Hallo Wolfgang,

falls du den Rückgabewert deiner Funktion erst zu dem Zeitpunkt benötigst,
wenn der Thread beendet ist, könnte die iVar :result für dich interessant sein.

Code: Alles auswählen

oThread:start( "Meine_Funktion" )
oThread:synchronize(0)
xResult := oThread:result
Beste Grüße,
Sören
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Threads und Rückgabewerte

Beitrag von Wolfgang Ciriack »

@Georg,
danke, das mit den Events benutze ich schon.

@Hubert
In diesem speziellen Fall will ich auf die Beendigung des Threads warten:

Code: Alles auswählen

oThread:start("IntMailSenden", aMails, cMailart, lVorschau, @retw)

       DO WHILE .NOT. oThread:synchronize(1)
          sleep(10)
       ENDDO

if retw 
...
endif
retw ergibt immer .T., obwohl ich in IntMailSenden retw mit .F. beschreibe.
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Threads und Rückgabewerte

Beitrag von brandelh »

Schau dir mal das Xbase++ Beispiel K:\XPPW32\source\samples\basics\THREAD\coffee.exe an.
Dort wird die Menge an Kaffee und Wartezustände zwischen den Threads ausgetauscht.

Ich selbst nutze die Parameterübergabe eigentlich nur um einen gewünschten Abbruch im zweiten Thread zu erkennen.
Ich dachte es geht mit der LOCAL per Referenz, aber eventuell braucht man doch eine STATIC / Funktion oder PRIVATE ?

Eleganter geht es im COFFEE Beispiel.
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Threads und Rückgabewerte

Beitrag von Wolfgang Ciriack »

Habe das jetzt mit einer static variablen gelöst.
Viele Grüße
Wolfgang
Antworten