Byte-Welt Forum

Zurück   Byte-Welt Forum > Andere Sprachen > C/C++

C/C++ Hier dreht sich alles um die Programmiersprachen C und C++.

Antwort
 
Themen-Optionen Thema durchsuchen
Alt 18.02.2010, 22:29   #1
Evgeni starter
 
Registriert seit: 22.11.2009
Beiträge: 37
Evgeni befindet sich auf einem aufstrebenden Ast
Evgeni eine Nachricht über MSN schicken
Standard Boost::Thread terminieren

Ok, danke! Ich werd schauen, dass ich ohne die OS-Signale auskommen.

Und dann hab ich noch eine Fragen, zu einem wieder anderen Thema!

Ich schreibe ein kleines Programm mit 3 Threads und verwende dabei Boost.Thread. Ein Thread ist für die Ausgabe (des Spielfeldes) zuständig, ein Zweiter wartet auf wartet wiederholt auf Eingabe (while-Schleife) und bewegt danach ein Figur. Der dritte Thread jagt (mit ner zweiten Figur) diese Figur, und wenn er sie erwischt, terminiert das Programm. Den Ausgabe-Thread und Jäger-Thread kann ich nun in diesem Falle sauber aus ihren while-Schleifen rauslaufen lassen (und so beenden). Aber was ich mit dem Eingabe-Thread mache, weiß ich nicht Es gibt ja kein thread.cancel() in Boost. Das Problem ist die Eingabe, an der Thread steht und wartet. Wenn ich nur also die Schleifenbedingung auf false setze, wird es ihn wenig beeindrucken...
In C und mit pthreads hab ich das mit cancel gelöst, aber hier weiß ich wirklich nicht wie dem beizukommen ist. Kann mir jemand helfen?
Ich denke, das Problem wird nicht neu sein....wie wird sowas normalerweise gelöst?
Evgeni ist offline   Mit Zitat antworten
Alt 19.02.2010, 07:43   #2
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Da es sich hierbei um ein neues Thema handelt war ich mal so frei Deine Frage in ein neues Thema zu verfassen. Dient nur der besseren Übersichtlichkeit und Wiederfindbarkeit

Zu Deiner Frage:
Zum Glück hat Boost:Thread keine Möglichkeit einen Thread einfach so "abzuschießen"! In den meisten Fällen wird einfach eine Exception geworfen bzw. irgendein Hardware-Interuppt ausgelöst welcher bewirkt das aus dem aktuell laufenden Thread herausgesprungen wird.

Damit man Threads aber regulär beenden kann, sind Flags das Mittel was Du suchst, Pseudo-Code:
CPP Code:
  1. bool thread1_is_running = true;
  2. void run_thread1() {
  3.   do {
  4.     // do any important stuff ...
  5.   } while(wait_for_something() && thread1_is_running);
  6. }
  7.  
  8. int main() {
  9.   thread1_is_running = false; // terminate thread1
  10. }

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Alt 19.02.2010, 11:58   #3
Evgeni starter
 
Registriert seit: 22.11.2009
Beiträge: 37
Evgeni befindet sich auf einem aufstrebenden Ast
Evgeni eine Nachricht über MSN schicken
Idee AW: Boost::Thread terminieren

Aaah...also könnte ich schreiben:

CPP Code:
  1. bool isHit = false
  2. char d;
  3. void runThreadrun(){
  4.      while( !isHit && (d = cin.get()) != 'q' ){    //'q' for quit
  5.       ..........
  6.     }

Aber das würde nur wegen lazy evaluation funktionieren, oder? Und andersrum ginge es nicht (cin.get() && !isHit)...

Und noch eine Frage hätt ich: Weißt du wie man cin entpuffert? Google bringt nur eher diffuse Antworten

p.s. Danke für den neuen Thread....ich hab mich gestern nicht getraut einen neuen zu beginnen, da eh schon 7 von 8 ersten Threads von mir sind
Evgeni ist offline   Mit Zitat antworten
Alt 22.02.2010, 23:12   #4
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Hm, in C++ muss ich passen da fällt mir gerade keine Möglichkeit ein das stdin(cin) unbuffered zu setzen. In C kenne ich nur die Funktion setbuf(stdin, NULL) bzw. setvbuf(stdin, NULL, _IONBF, 0).
Ansonsten bietet ncurses einem solche Möglichkeiten.

Threads kannst Du hier beliebig viele aufmachen das wird keinem vorgezählt Je mehr um so besser für die anderen die die Suche benutzen oder über Google zu uns stoßen.

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Alt 23.02.2010, 09:16   #5
Jango
Adminin
 
Registriert seit: 21.12.2006
Ort: Erfurt/ Thür.
Beiträge: 723
Jango befindet sich auf einem aufstrebenden Ast
Jango eine Nachricht über ICQ schicken Jango eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Wie man das in C++ macht, weiß ich auch nicht, aber in C gibts dafür die Funktion getch() im Header <conio.h>. Musst du halt den Code mischen.

Zur Not, hier mal reinschauen.
Jango ist offline   Mit Zitat antworten
Alt 23.02.2010, 13:47   #6
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Zitat:
Zitat von Jango Beitrag anzeigen
Wie man das in C++ macht, weiß ich auch nicht, aber in C gibts dafür die Funktion getch() im Header <conio.h>. Musst du halt den Code mischen.

Zur Not, hier mal reinschauen.
conio.h gehört aber nicht zum Standard und unter Unix/Linux gibt es dafür imho keine Implementierung.

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Alt 23.02.2010, 13:55   #7
Jango
Adminin
 
Registriert seit: 21.12.2006
Ort: Erfurt/ Thür.
Beiträge: 723
Jango befindet sich auf einem aufstrebenden Ast
Jango eine Nachricht über ICQ schicken Jango eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Zitat:
Zitat von VuuRWerK Beitrag anzeigen
conio.h gehört aber nicht zum Standard und unter Unix/Linux gibt es dafür imho keine Implementierung.
Weiß... Aber was ich nicht wusste, ist, dass er das für Linux bastelt. Hab ich wahrscheinlich überlesen (oder verdrängt...).
Jango ist offline   Mit Zitat antworten
Alt 23.02.2010, 22:02   #8
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Ich unterstelle es ihm da er bisher immer für Unix entwickelt hat

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Alt 24.02.2010, 13:59   #9
Jango
Adminin
 
Registriert seit: 21.12.2006
Ort: Erfurt/ Thür.
Beiträge: 723
Jango befindet sich auf einem aufstrebenden Ast
Jango eine Nachricht über ICQ schicken Jango eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Also, ich habe mich da mal schlau gemacht:

Für Linux den Header curses.h der Bibo ncurses einbinden.
Dann kann man getch() verwenden.
Jango ist offline   Mit Zitat antworten
Alt 24.02.2010, 18:13   #10
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: Boost::Thread terminieren

Genau, ncurses hab ich ihm ja auch schon empfohlen aber seither unterhalten wir 2 uns darüber
Sollte ich dennoch mal einen Anflug von Zeit haben schau ich mal wie man es in C++ macht. Ich denke mal das es eventuell durch setzen der ios-flags geht aber ich habe hatte dazu noch nix finden können.

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
-


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
#include <boost/foo.hpp> Evgeni C/C++ 11 18.02.2010 15:25
Der Bug-Thread L-ectron-X Kritiken & Anregungen 94 17.02.2010 06:15
Der Lösch-Thread pcworld Wiki 4 27.11.2008 11:20
AWT dispatch thread Peter DockingFrames 3 05.08.2008 13:02
Thread(s)? Vril Java Standard Edition (J2SE) 9 11.10.2006 21:10


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.