Grischa Geschrieben 19. November 2009 Geschrieben 19. November 2009 Hallo. Ich muss ein Programm schreiben welches per ESC Taste beendet werden muss (Consolenanwendung). Ich möchte aber nicht immer abfragen ob die ESC Taste gedrückt wurde, sondern permanent abfragen ob die Taste gedrückt wurde. Ich habe das mit einem Thread versucht aber dieser läuft nur vor dem egtl Hauptprogramm ab. Zu Testzwecken habe ich eine Ausgabe anstatt des Programm beenden in die if Abfrage geschrieben. #include <cstdlib> #include <iostream> #include <math.h> #include <stdio.h> #include <conio.h> #include <string> #include <iomanip> #include <windows.h> using namespace std; DWORD WINAPI MyThread(LPVOID parameter) { int c; // parameter wird in diesem Beispiel nicht genutzt while(true) { fflush(stdin); c = getch(); if (c==27) { cout << " Test "; } cout << c ; fflush(stdin); } } int main(int argc, char *argv[]) { fflush(stdin); CreateThread(NULL, 0, MyThread, NULL, 0, NULL); Sleep(5000); cout << "test"; So, wenn ich das Programm starte, dann gibt er "Test" aus wenn ich ESC drücke. Sobald der Sleeptimer runtergelaufen ist, passiert nichts mehr wenn ich ESC drücke. Kann mir jemand helfen? Danke schonmal im vorraus!!! Zitieren
skejcik Geschrieben 20. November 2009 Geschrieben 20. November 2009 Also ich habe bisher nur englische Hilfe in Forum gefunden. Und die meisten Leute haben nix erklärt nur irgendeinen Code gepostet der nicht funktioniert, wenn ichs in mein programm kopiere. Ich habe eine Funktion geschrieben, die Dateien von A nach B kopiert. Und eine schöne Bildlaufleiste als Animation gemacht, die Zeigt, dass der PC noch am schaffen ist. Und diese Leiste bleibt sehen, wenn ich kopiere, weil das System ausgelastet ist. Also wollte ich das kopieren in einem eigenen Thread machen.... Und ich fände es schön, wenn man mir auch ein bissel was dazu erklären könnte. Das hier hab ich z.B. bekommen: DWORD dwThreadId; HANDLE hThread; hThread = CreateThread( NULL, // default security attributes 0, // use default stack size ThreadFunc, // thread function NULL, // argument to thread function 0, // use default creation flags &dwThreadId); // returns the thread identifier Kann damit nix anfangen. Wie bekomme ich da meine Kopieren Funkion rein? hey Filou , was für ein BUILDER benutzt du ? am besten du kopierst die ein Wort wie z.B CreateThread schreibst das in dein programm, markierst das Wort und drückst F1 Wenn du MSDN hast :-)! lg, skejcik. Zitieren
Klotzkopp Geschrieben 20. November 2009 Geschrieben 20. November 2009 Das kommt dabei raus, wenn man sich mit einer neuen Frage an einen alten Thread ranhängt: Die Leute antworten auf das alte Problem, auch wenn das schon vier Jahre alt ist. Ich habe das hier mal abgetrennt, damit das nicht mehr passiert. Und zum Problem: Steht da noch etwas hinter dem cout in main? Zitieren
Grischa Geschrieben 20. November 2009 Autor Geschrieben 20. November 2009 Ja, es folgt ein einfacher Taschenrechner int main(int argc, char *argv[]) { fflush(stdin); CreateThread(NULL, 0, MyThread, NULL, 0, NULL); Sleep(4000); float z1,z2, erg, ab=0; do { fflush(stdin); system("cls"); cout << "\n Bitte waehlen Sie : \n" ; cout << " 1. Zwei Zahlen addieren \n" ; cout << " 2. Zwei Zahlen subtrahieren \n" ; cout << " 3. Zwei Zahlen muldiplizieren \n" ; cout << " 4. Zwei Zahlen dividieren \n" ; cout << " 5. Programm beenden\n" ; cout << "\n\n"; cin >> ab; if(ab==5) system("exit"); else if(ab == 1 || ab == 2 || ab == 3 || ab == 4 ) { cout << " Bitte geben Sie die erste Zahl ein : "; cin >> z1; cout << "\n\n Bitte geben Sie die zweite Zahl ein : "; cin >> z2; cout << "\n\n"; if(ab==1) { erg = z1 + z2; cout << " Das Ergebnis : " << erg; cout << "\n\n"; cout << " Zum Beenden des Programms bitte die '5' dreucken \n" ; cin >> ab; } Ich kürze das ganze mal ab und lasse die anderen Fälle weg. cout << " Zum Beenden des Programms bitte die '5' dreucken \n" ; cin >> ab; } } else { cout << " Ungueltige Eingabe! \n"; cout << " Bitte waehlen Sie neu!\n"; ab=6; Sleep(1000); } }while(ab != 5); system("PAUSE"); system("exit"); } Hoffe das hilft bei der Problemlösung. Zitieren
skejcik Geschrieben 20. November 2009 Geschrieben 20. November 2009 system("PAUSE"); system("exit"); wieso net gleich mit return 0; ??^^ Quelle Zitieren
TDM Geschrieben 20. November 2009 Geschrieben 20. November 2009 (bearbeitet) system("PAUSE"); system("exit"); wieso net gleich mit return 0; Weil dann Fenster zu. Dann lieber vor dem return noch ein cin.get(). [Editerle] Threads sind hier meiner Meinung nach unangebracht, einfach ordentlich die Nachrichtenfunktionen (MFC) von Windows verwenden, dann kommt bei einem Buttondruck ein entsprechendes Event an und da kann man abprüfen, ob oder ob nicht ESC und entsprechend reagieren. Bearbeitet 20. November 2009 von TDM Zitieren
skejcik Geschrieben 20. November 2009 Geschrieben 20. November 2009 Weil dann Fenster zu. Dann lieber vor dem return noch ein cin.get(). [Editerle] Threads sind hier meiner Meinung nach unangebracht, einfach ordentlich die Nachrichtenfunktionen (MFC) von Windows verwenden, dann kommt bei einem Buttondruck ein entsprechendes Event an und da kann man abprüfen, ob oder ob nicht ESC und entsprechend reagieren. Mit return 0; geht Fenster auch zu ?:-/ Zitieren
TDM Geschrieben 20. November 2009 Geschrieben 20. November 2009 Mit return 0; geht Fenster auch zu ?:-/ Ja, habe ich doch geschrieben. "return 0;" in der Main heißt nichts anderes als: Programm fehlerfrei beenden Und wenn man nicht grad von der Console das Programm gestartet hat, geht die Dose dann mit zu. (Dieser "Drücken Sie eine beliebige [...]" - Text kommt nur während dem Debuggen und auch nur bei bestimmten Projekteinstellungen.) Zitieren
Grischa Geschrieben 23. November 2009 Autor Geschrieben 23. November 2009 Ja gut ich habe es jetzt mit return 0; gemacht. Trotzden weicht ihr leider vom Thema ab... Ich arbeite übrigens mit DevC++ falls das in irgendeiner weise relevant ist für das Problem. Zitieren
TDM Geschrieben 23. November 2009 Geschrieben 23. November 2009 Ich arbeite übrigens mit DevC++ falls das in irgendeiner weise relevant ist für das Problem. Ihh. Dev-C++ Die letzten Arbeiten an Dev-C++ wurden im März 2005 veröffentlicht. An dem Status der letzten zugänglichen Beta-Version hat sich seitdem nichts verändert, man geht deshalb davon aus, dass die Arbeiten an diesem Projekt eingestellt wurden. Zitieren
Klotzkopp Geschrieben 23. November 2009 Geschrieben 23. November 2009 Erstens, lass die Finger von Dev-C++. Diese IDE hat viele Fehler und wird seit Jahren nicht mehr weiterentwickelt. Zweitens ist es keine gute Idee, wenn zwei Threads gleichzeitig auf Tastatureingaben warten. Das kann nur schiefgehen. Drittens solltest du deine Threads mit _beginthread(ex) starten, wenn du in der Threadfunktion irgendwelche Funktionen der Standardbibliothek benutzen willst. CreateThread ist eine Low-Level-Funktion, die man eher selten braucht. Das hat aber vermutlich nichts mit deinem Problem zu tun. Viertens, fflush(stdin) erzeugt undefiniertes Verhalten. Zumindest kannst du dich nicht darauf verlassen, dass das portabel ist. Soweit ich weiß, bewirkt das nur bei den Microsoft-Compilern das Leeren des Tastaturpuffers. Fünftens, system("exit") tut rein gar nichts, außer Prozessorzeit zu verbraten. Du startest damit einen neuen Prozess, der sich dann sofort selbst beendet. Dein Programm läuft danach einfach weiter. Zitieren
Grischa Geschrieben 23. November 2009 Autor Geschrieben 23. November 2009 Okay. Gibts einen Compiler den ihr mir emfehlen könnt? Welche möglichkeit gibt es denn, wenn ich keine Threads benutzen soll? Wie gesagt ich bin kein c++ Profi und nehme gerne alle Hilfe an! Zitieren
Klotzkopp Geschrieben 23. November 2009 Geschrieben 23. November 2009 Okay. Gibts einen Compiler den ihr mir emfehlen könnt?Nimm Code::Blocks oder Microsoft Visual C++ Express Edition. Welche möglichkeit gibt es denn, wenn ich keine Threads benutzen soll?Solange dein Programm zwischen den regulären Tastatureingaben so wenig tut (die Berechnungen dauern ja nicht lang), ist es völlig egal, ob du ständig (also in einem separaten Thread) auf die Betätigung der Esc-Taste wartest, oder nur dann, wenn du sowieso eine Tastatureingabe erwartest. Da du allerdings die Esc-Taste nicht mit cin erwischst, müsstest du dir eine eigene Eingabefunktion schreiben, mit _kbhit und _getche zum Beispiel, um die cin-Eingabe nachzubauen und trotzdem jederzeit auf Esc reagieren zu können. Zitieren
Grischa Geschrieben 23. November 2009 Autor Geschrieben 23. November 2009 Okay habe jetzt Code::Blocks. Ist wirklich um einiges besser als Dev C++. Ich habe das ganze jetzt mal so gemacht wie du es vorgeschlagen hast. if(ab == 49 || ab == 50 || ab == 51 || ab == 52 ) { cout << " Bitte geben Sie die erste Zahl ein : "; z1=getchar(); if(z1==27) return(0); cout << "\n\n Bitte geben Sie die zweite Zahl ein : "; z2=getchar(); if(z2==27) return(0); cout << "\n\n"; Mit getche(); und getch(); klappts auch wunderbar, aber da wird ja nur eine Zahl eingelesen. Mit getchar(); klappt leider das mit der ESC Taste nicht. Allerdings überspringt er die 2. Eingabe. Wenn er die Sache zum 2. durchgeht überspringt er die erste Eingabe. Noch eine letzte Sache : wie kann ich die eingelesen ASCII Zeichen wieder in normale Zahlen umnwandeln? Gibts da nen Befehl für? Danke für die Hilfe! Zitieren
Hexagon Geschrieben 23. November 2009 Geschrieben 23. November 2009 Moin. Noch eine letzte Sache : wie kann ich die eingelesen ASCII Zeichen wieder in normale Zahlen umnwandeln? Gibts da nen Befehl für? atoi? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.