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 :frowning: 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?

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 :wink:

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:

bool thread1_is_running = true;
void run_thread1() {
  do {
    // do any important stuff ...
  } while(wait_for_something() && thread1_is_running);
}

int main() {
  thread1_is_running = false; // terminate thread1
}

Gut Schuß
VuuRWerK :wink:

Aaah…also könnte ich schreiben:

bool isHit = false
char d;
void runThreadrun(){
     while( !isHit && (d = cin.get()) != 'q' ){    //'q' for quit
      ..........
    } ```

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 :o)

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 :wink: Je mehr um so besser für die anderen die die Suche benutzen oder über Google zu uns stoßen.

Gut Schuß
VuuRWerK :wink:

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.

[QUOTE=Jango]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.[/QUOTE]

conio.h gehört aber nicht zum Standard und unter Unix/Linux gibt es dafür imho keine Implementierung.

Gut Schuß
VuuRWerK :wink:

[QUOTE=VuuRWerK]conio.h gehört aber nicht zum Standard und unter Unix/Linux gibt es dafür imho keine Implementierung.
[/QUOTE]

Weiß… Aber was ich nicht wusste, ist, dass er das für Linux bastelt. Hab ich wahrscheinlich überlesen (oder verdrängt…:D).

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

Gut Schuß
VuuRWerK :wink:

Also, ich habe mich da mal schlau gemacht:

Für Linux den Header curses.h der Bibo ncurses einbinden.
Dann kann man getch() verwenden.

Genau, ncurses hab ich ihm ja auch schon empfohlen aber seither unterhalten wir 2 uns darüber :smiley:
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 :wink: