Warten bis Thread fertig
-
Nein ich habe nur einen Thread nicht zwei, und will nur wissen wann er beendet ist, und so lange er nicht beendet ist soll eine andere Aktion durchgeführt werden.
-
In dem Beispiel ist nur ein zusätzlicher Thread neben dem Hauptthread. Wenn du nur den Hauptthread hättest, dann benutzt du gar keine Threads in dem Sinne, wie man das normalerweise meint.
-
Nun, das wird ohne weiteres nicht gehen. Dazu brauchst du Kommunikationsmittel wie Signale, Mutex oder atomare Variablen. D.h. am Ende deines Threads wird eine "globale" Variable "fertig" auf wahr gesetzt, die immer abgefragt wird. Das eine Moeglichkeit, einfach aber nicht sehr sauber.
-
@Seppj und alle anderen: Hat man denn keine Möglichkeit abzufragen ob der Thread noch läuft? Wie z.B. while(thread.istnichtfertig) do ... ?
-
Ich würde mir an dieser Stelle gerne wünschen, dass du mal konkret wirst. Ich befürchte nämlich gerade aus Erfahrung, dass du eigentlich was ganz konkretes vor hast, das mit den vielen Standardsynchronisationsmitteln eigentlich ganz einfach wäre, du aber gar nicht weißt, was alles möglich ist und daher kompliziert fragst.
-
tanja.hopfer schrieb:
@Seppj und alle anderen: Hat man denn keine Möglichkeit abzufragen ob der Thread noch läuft? Wie z.B. while(thread.istnichtfertig) do ... ?
Nein, diese uebergeordnete Logik ist selbst zu implementieren.
-
knivil schrieb:
tanja.hopfer schrieb:
@Seppj und alle anderen: Hat man denn keine Möglichkeit abzufragen ob der Thread noch läuft? Wie z.B. while(thread.istnichtfertig) do ... ?
Nein, diese uebergeordnete Logik ist selbst zu implementieren.
... wie ich bereits mit einem trivialen Beispiel gezeigt habe.
Youka schrieb:
Del1nquenz schrieb:
Erst startest du deinen Thread, dann fährst du fort mit deiner anderen Aufgabe, welche in einer Schleife läuft, die durch den Zustand der Inaktivität des Threads abbricht. Del1nquenz hat bereits die Funktion zur Statusabfrage erwähnt.
Ja, und die ist hier - zum zweiten mal - unangebracht. Das funktioniert nicht.
N3337 [thread.thread.member]/2 schrieb:
bool joinable() const noexcept;Returns: get_id() != id()
N3337 [thread.thread.id]/1 schrieb:
Each thread of execution has an associated thread::id object that is not equal to the thread::id object of any other thread of execution
and that is not equal to the thread::id object of any std::thread object that does not represent threads of execution.joinable()hat nichts mit dem "Arbeitsstatus" des Threads zu tun, sondern damit, ob der Thread bspw. default-constructed wurde.
-
Und was soll sie* damit anfangen? Sobald der Thread gestartet ist, und auch nachdem er beendet ist, kann gejoined werden.
Hab mich da wohl vertan.
-
Del1nquenz schrieb:
Und was soll sie* damit anfangen? Sobald der Thread gestartet ist, und auch nachdem er beendet ist, kann gejoined werden.
Hab mich da wohl vertan.
Ach, absolut kein Problem.

Wenn ich das bloß jedes mal einfach so hätte schreiben können...
-
@SeppJ, ja das glaube ich auch. Also ich habe einen Thread angelegt der etwas ausführen soll im Hintergrund, jedoch so lange er ausgeführt wird eine bestimmte Aktion ausgeführt wird, die anzeigt, dass der thread noch arbeitet.
-
Dann mach es so wie Sone dir gezeigt hat?
-
@tanja.hopfer:
Meinst du so ewtas?Pseudocode
typedef enum { RUNNING, ENDED } tThreadStatus; void Thread_Function1(tThreadStatus& Status) { Status = RUNNING; // do something Status = ENDED; } void abc() { tThreadStatus Status; // Status, welcher unser Thread setzt Start_Thread(Thread_Function1, Status) while(Status == RUNNING) { // do something } }Anmerkung:
Dies ist nur eine Ideen-Skizze und keine Implementierung und hat per Definition nichts mit C++ zu tun. :p
-
Hört sich für mich nach einer Art Statusmeldung/Ladebalken an, der z.B. im Vordergrund laufen soll während im Hintergrund gearbeitet wird.
-
Statt diesem Gemache mit den Locks, wäre für Windows Threads nicht GetExitCodeThread eine elegante Lösung?
-
Bitte ein Bit schrieb:
tThreadStatus Status; // Status, welcher unser Thread setzt Start_Thread(Thread_Function1, Status)Ich wuerde Status noch initialisieren, auch wenn das in deinem Pseudo-C++ okay sein sollte.