pthread probleme ?!
-
Guten Morgen bzw schönen Sonntag erstmal wünsche.
Habe eine problem mit pthread., zumindest schätze ich das es daran liegt.
Wenn ich den unten aufgeführten Code starte hängt es sich nach mehrmaligen schliesen /öffnen des Fenster für Jalousie auf und eigentlich sollte das Fenster nur mit der ESC-taster beendet werden können aber es geht auch hin und wieder mit einer anderen (z.b F2).Könnte mir jemand evtl tipps geben wo da der wurm drin ist ?
Mfg Michael
//******* g++ -Wall -lncurses -lpanel -lpthread -o menu menu.cc #include <panel.h> #include <curses.h> #include <iostream> #include <stdlib.h> #include <ctime> #include <pthread.h> using namespace std; //******** speicherfrage der panel/fenster ******** WINDOW *win1, *win2, *win3, *win4, *win5; PANEL *pan1, *pan2, *pan3, *pan4, *pan5; void ende() { del_panel(pan1); del_panel(pan2); del_panel(pan3); del_panel(pan4); del_panel(pan5); delwin(win1); delwin(win2); delwin(win3); delwin(win4); delwin(win5); endwin(); cout <<"Programm Beemdet durch Benutzer\n"; } void uhrzeit() //*********** Zeitabfrage und umwandeln ********* { // stellt lzeit eine zeichenkette von 80 zu verfügung char lzeit[80]; // zeitabfrage und in lokaler zeit umwandeln time_t zeit = time(NULL); tm *p_zeit = localtime(&zeit); // schreibt in lzeit den string (text und uhrzeit) strftime(lzeit, sizeof(lzeit), "Es ist der %d %b %Y und %H:%M:%S",p_zeit); mvaddstr(23, 44, lzeit); } void haupt() //************** Hauptauswahlmenu *************** { win1 = newwin (20, 79, 2, 0); box(win1, ACS_VLINE, ACS_HLINE); pan1 = new_panel(win1); wbkgd(win1, COLOR_PAIR(3)); mvwaddstr(win1, 1, 5, "1 = Jalousiesteuerung"); mvwaddstr(win1, 2, 5, "2 = Lichtsteuerung"); mvwaddstr(win1, 3, 5, "3 = Gartenanlage"); mvwaddstr(win1, 4, 5, "4 = Ausenbeleuchtung"); } void jalousie() { win2 = newwin (10, 30, 4, 40);//****** tiefe, laenge, y, x ****** box(win2, ACS_VLINE, ACS_HLINE); pan2 = new_panel(win2); wbkgd(win2, COLOR_PAIR(2)); mvwaddstr(win2, 1, 2, "1 = Jalousie Schlafzimmer"); mvwaddstr(win2, 2, 2, "2 = Jalousie Wohnzimmer"); mvwaddstr(win2, 3, 2, "3 = Jalousie Badezimmer"); mvwaddstr(win2, 4, 2, "4 = Jalousie Flur oben"); mvwaddstr(win2, 5, 2, "5 = Jalousie Flur unten"); mvwaddstr(win2, 6, 2, "6 = Jalousie Gaestezimmer"); mvwaddstr(win2, 8, 2, "ESC zurueck zum Hauptmenue"); if (wgetch(win2) == 27 ) { del_panel(pan2); delwin(win2); top_panel(pan1); update_panels(); doupdate(); } } void auswahl() { pthread_t p4; if (getch() == 49) { pthread_create (&p4, NULL, (void*(*)(void*)) jalousie, NULL); } } int main() { pthread_t p1, p2, p3; initscr(); timeout(0); atexit(ende); // ausgang clear(); noecho(); curs_set(0); // cursor ausschalten cbreak(); keypad(stdscr, 1); start_color(); init_pair(1, COLOR_BLUE, COLOR_BLACK); // Schrift Blau/Hintergund Schwarz init_pair(2, COLOR_GREEN, COLOR_BLACK); init_pair(3, COLOR_YELLOW, COLOR_BLACK); bkgd(COLOR_PAIR(1)); // Hauptfensterfarbe attrset (A_BOLD); mvaddstr(0,24, "Steuerungsmenue / Homecontroll"); mvaddstr(23,0, " F1 um Oberflaeche zu beenden"); pthread_create (&p2, NULL,(void*(*)(void*)) haupt, NULL); while(getch() != KEY_F(1)) { pthread_create (&p1, NULL,(void*(*)(void*)) uhrzeit, NULL); pthread_create (&p3, NULL,(void*(*)(void*)) auswahl, NULL); pthread_join (p1, NULL); pthread_join (p3, NULL); update_panels(); doupdate(); } return (0); }
-
Ich kenne dein verwendetes GUI-System nicht und weiß daher nicht, ob du überhaupt Threads dafür benötigst, aber du scheinst Threads nicht richtig einzusetzen.
Wenn du die Funktion jalousie() als eigenen Thread startest, dann beendet sich der Thread auch automatisch wieder, sobald diese Funktion sich beendet.
void jalousie() { // ... if (wgetch(win2) == 27 ) { del_panel(pan2); delwin(win2); top_panel(pan1); update_panels(); doupdate(); } } // hier wird der Thread beendet
d.h. egal welche Taste du drückst!!!
Es fehlt bei dir eine Hauptschleife für die Eventbehandlung!
Mehr kann ich dir leider nicht sagen, aber ich denke, du solltest dir mal ein Tutorial (Beispiel) zu dem GUI-System ansehen.
-
Hallo Th
nun ich habe mir freebsd 6.2 und kein extra x-system aufgespielt also recht Nackt.
Nun ein beispiel hatte ich so nicht direkt gefunden.
.
Also wenn ich dich nu richtig verstehe müste ich void jalousie in einer
while(wgetch(win2 ) != 27 ) packen damit der thread nicht gleich beendet ?
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.