Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!!!

Geschrieben
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.

Geschrieben

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?

Geschrieben

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.

Geschrieben (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 von TDM
Geschrieben
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 ?:-/

Geschrieben
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.)

Geschrieben

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.

Geschrieben
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.
Geschrieben

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.

Geschrieben

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!

Geschrieben
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.

Geschrieben

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!

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...