PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Glib::Threads - läuft der Thread noch?



Larry_Croft
10-09-2007, 16:02
Ich spiele gerade mit den Threads von Glib rum. Einen Thread zu starten und auf sein Ende zu warten ist kein Problem, aber wie kann ich überprüfen ob ein Thread noch läuft? Ich meine z.B. sowas:

Glib::Thread *thread = Glib::Thread::create(sigc::mem_fun(*this, &MeineKlasse::a), true);
while(!thread->done()) {
xyz();
}
Ich suche jetzt das Pendant zu meinem "thread->done()" :-)

Kleine Anmerkung: Ich schreibe eine Gtk Anwendung, daher benutze ich Glib (war nunmal in der Anleitung verlinkt). Wenn sich alle einig sind dass die Glib Threads nichts taugen würde ich auch mal in Boost oder so reinschnuppern.

P.S.: thread == NULL bringt leider auch keinen Erfolg

jeebee
10-09-2007, 16:15
hmm, nach betrachten des Sourcecodes unter [1] denke ich, du musst nicht auf NULL sondern auf 0 (Null) überprüfen. Vergleiche auch [1]:Linien 93 und 94

[1] http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/thread_2dispatcher_8cc-example.html

Larry_Croft
10-09-2007, 17:19
Danke für die schnelle Antwort. Klappt aber leider nicht - habs ausprobiert. Außerdem habe ich dabei gemerkt dass es so oder so nicht viel Sinn macht nen Zeiger mit nem int Wert zu vergleichen...frag mich also was die Zeile in dem Beispiel (hinter das ich noch nicht ganz hintergestiegen bin) soll!?

anda_skoa
10-09-2007, 18:50
Außerdem habe ich dabei gemerkt dass es so oder so nicht viel Sinn macht nen Zeiger mit nem int Wert zu vergleichen...frag mich also was die Zeile in dem Beispiel (hinter das ich noch nicht ganz hintergestiegen bin) soll!?

Der Thread Zeiger wird in join() auf 0 gesetzt, nachdem Thread::join() zurückgekehrt ist.

Ein Thread läuft so lange, wie seine Threadfunktion braucht, d.h. wenn das eine Endlosschleife ist, für immer.

Wenn du eine terminierende Funktion hast, dann kannst du ja am Ende ein Flag setzen und das von außen abfragen.

Ciao,
_

Larry_Croft
10-09-2007, 20:10
Der Thread Zeiger wird in join() auf 0 gesetzt, nachdem Thread::join() zurückgekehrt ist.
Also die Zeile std::cout << thrad; liefert mir vor und nach join jeweils die gleiche Adresse (also 0xbla). Bin mir aber auch nicht sicher ob ich das überhaupt so einfach machen darf :-). Allerdings ist thread != 0 (bzw != NULL), auch nach thread->join();


Wenn du eine terminierende Funktion hast, dann kannst du ja am Ende ein Flag setzen und das von außen abfragen.
Das wäre natürlich ein Workaround welcher auch funktionieren würde, aber eine innere Stimme sagt mir, dass das nicht der "perfekte" Weg ist.

anda_skoa
11-09-2007, 14:40
Also die Zeile std::cout << thrad; liefert mir vor und nach join jeweils die gleiche Adresse (also 0xbla). Bin mir aber auch nicht sicher ob ich das überhaupt so einfach machen darf :-). Allerdings ist thread != 0 (bzw != NULL), auch nach thread->join();

Ich rede von der join() Methode im Beispielcode. Die ruft Thread::join() auf und setzt danach den Pointer auf 0.
0 ist übrigens in C++ der korrekte Weg einen Nullpointer zu setzen, der Compiler erledigt die Konversion auf den korrekten Typ.



Das wäre natürlich ein Workaround welcher auch funktionieren würde, aber eine innere Stimme sagt mir, dass das nicht der "perfekte" Weg ist.

Wenn der Aufrufer blockieren darf, geht das eben über join(). Ansonsten macht man das mit einem Flag oder der Thread meldet sich ab, d.h. er ruft irgendeine Funktion auf, die dann etwas setzt und eventuell den Haupthread benachrichtig.

Ciao,
_

Larry_Croft
12-09-2007, 12:43
Nagut, habs jetzt über eine (ein? eine? was auch immer...) Flag gemacht...aber ich frag mich trotzdem Glib sowas wie Thread abbrechen o.ä. versteckt hat - muss man das echt alles über Flags lösen?

anda_skoa
12-09-2007, 18:04
Eine Thread kann man auch nicht abbrechen, zumindest nicht portabel. Das macht man ebenfalls über eine Bedingung, die der Thread kontinuierlich abfragt und gegebenfalls abbricht.

Ciao,
_

Larry_Croft
12-09-2007, 18:13
Java kann es :rolleyes:

Aber gut, da jetzt an sich alles läuft bin ich zufrieden. Danke für die viele Hilfe!

anda_skoa
13-09-2007, 14:30
Java kann es :rolleyes:

Abbrechen?

deprecates seit mindestens 1.1

Ciao,
_

Larry_Croft
13-09-2007, 15:06
deprecates seit mindestens 1.1
Mit dir macht es keinen Spaß zu diskutieren ;-)