Programm soll code weiterhin ausführen und trotz noch nicht beendert cin >> Eingabe.



  • Hallo,
    ich habe ein kleines Programm geschrieben und will das der Code weiterhin ausgeführt wird, obwohl das Programm eigentlich auf cin wartet. Das ziel ist es, dass das Programm nach den Eintippen eines Codewortes (z.B stop) beendet wird. Allerdings solange, bis es dazu kommt, weiter arbeitet.

    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string>
    using namespace std;
    
    int main (void)
    {
    
       cout << "Zeit (in Sekunden) \n";
       double zeit;
       cin >> zeit;
    
       zeit = zeit * 1000;
    
       string s;
    
       Sleep (zeit);
    
     while (true)	{
    
    srand (time(NULL));
    int x = rand() % 1600 + 7; 
    
    srand (time(NULL));
    int y=rand() % 900 + 1; 
    
    	cout << x << "   " << y << endl;
    
    cin >> s;                   // programm so dennoch weiterarbeiten.
    
    if (s == "stop"){           // Passwort
    
    	break;
    }
    
    else;
    
    Sleep (5500);
    
    }
    return 0;
    }
    

    Ich wäre sehr erfreut über Hilfe.


  • Mod

    Die kurze Antwort wäre: Das ist nicht gerade einfach und übersteigt deine Fähigkeiten vermutlich bei weitem. Die Empfehlung wäre, erst einmal richtig ordentlich Programmieren zu lernen, anstatt sich mit solchen Äußerlichkeiten zu befassen. Wenn es für die Funktion des Programms essentiell ist, dann sollte es auch eine Endlosschleife plus das gute alte CTRL+C tun.

    Ist die Antwort zufriedenstellend oder musst du einfach wissen, wie es ginge? Die Antwort wäre umfangreich und würde wahrscheinlich ohnehin nicht verstanden werden.



  • SeppJ schrieb:

    Die kurze Antwort wäre: Das ist nicht gerade einfach und übersteigt deine Fähigkeiten vermutlich bei weitem. Die Empfehlung wäre, erst einmal richtig ordentlich Programmieren zu lernen, anstatt sich mit solchen Äußerlichkeiten zu befassen. Wenn es für die Funktion des Programms essentiell ist, dann sollte es auch eine Endlosschleife plus das gute alte CTRL+C tun.

    Ist die Antwort zufriedenstellend oder musst du einfach wissen, wie es ginge? Die Antwort wäre umfangreich und würde wahrscheinlich ohnehin nicht verstanden werden.

    jop entweder eine while schleife in der art vll:

    ...
    while(s != "stop")
    {
      // Code der "weiterlaufen soll...
    }
    ...
    

    oder du könntest das auch mit async-threads lösen...

    da könntest ein thread-"bauen" der auf die eingabe wartet und evt (falls das auch sein kann) andere eingaben verarbeitet und reagiert, dann darauf hin entweder den anderen async-thread2(hier ist der rest der logik - die "weiterlaufen" soll) benachrichtigt oder dann nur das programm definiert beendet...

    (zumindest hab ich solche probleme immer so gelöst, gibt wahrscheinlich aber auch andere/bessere lösungen(vorschläge))

    wenn du aber eher nur ein "kleines" programm entwickelst und dich noch nicht so viel c++ gemacht hast würde ich eher die while schleife empfehlen...

    hoff ich konnte helfen 🙂
    lg



  • WeiterLauf schrieb:

    jop entweder eine while schleife in der art vll:

    ...
    while(s != "stop")
    {
      // Code der "weiterlaufen soll...
    }
    ...
    

    lg

    Hallo,
    Danke das du dir die Zeit nimmst mir zu helfen. Ich verstehe nicht wie einen mir diese While schleife hefen soll. Das Problem, dass das Programm weiter laufen soll und gleichzeitig bereit sein soll jeder Zeit sich selbst durch ein Passwort zu beenden besteht ja weiterhin (das system stopt bei cin >>. Ich würde die Schliefe, welche ich gemacht habe sogar bevorzugen ( die mit break;), da man dort nicht nach Eingeben das Passworts noch 5,5 Sekunden warten muss.

    SeppJ schrieb:

    Die kurze Antwort wäre: Das ist nicht gerade einfach und übersteigt deine Fähigkeiten vermutlich bei weitem. Die Empfehlung wäre, erst einmal richtig ordentlich Programmieren zu lernen, anstatt sich mit solchen Äußerlichkeiten zu befassen. Wenn es für die Funktion des Programms essentiell ist, dann sollte es auch eine Endlosschleife plus das gute alte CTRL+C tun.

    Ist die Antwort zufriedenstellend oder musst du einfach wissen, wie es ginge? Die Antwort wäre umfangreich und würde wahrscheinlich ohnehin nicht verstanden werden.

    Hallo.
    Erstmal danke auch an dich. Mit dieser Aussage könntest du wahrscheilich recht habe. Damit du dir aber ein Bild machen kannst was ich alles kann, kommt hier eine kleine Aufzaählung: Die einfachen Grundlangen. Stings, fstreams (if-ofstream),Schreiben definieren und einbiden von eigenen Funktione. Überladen von Fuktionen, erstellung rekursiven Abstiegs, Erstellung eigener Headers, die Gültigkeitsbereiche von Variablen in Headers(welche einen Projekt zugehörig sind(sowas wie extern oder const)), Eigene Makros mit Define schreiben, Templates und momentan bin ich daran abstrakte Datentypen zu lehren.

    Reicht diese wissen aus um das Problem zu lösen oder soll ich erst noch mehr lernen?



  • //gelöscht



  • win8789 schrieb:

    WeiterLauf schrieb:

    jop entweder eine while schleife in der art vll:

    ...
    while(s != "stop")
    {
      // Code der "weiterlaufen soll...
    }
    ...
    

    lg

    Hallo,
    Danke das du dir die Zeit nimmst mir zu helfen. Ich verstehe nicht wie einen mir diese While schleife hefen soll. Das Problem, dass das Programm weiter laufen soll und gleichzeitig bereit sein soll jeder Zeit sich selbst durch ein Passwort zu beenden besteht ja weiterhin (das system stopt bei cin >>. Ich würde die Schliefe, welche ich gemacht habe sogar bevorzugen ( die mit break;), da man dort nicht nach Eingeben das Passworts noch 5,5 Sekunden warten muss.

    ich meinte das so:

    ...
    
    int main (void)
    {
    	string s;
    	int counter = 0;
    
    	cout << "Start ... \n";
    
    	double eingabe;
    	cout << "Bitte 1. Eingabe (Sleep-Zeit):";
    	cin >> eingabe;
    
    	// Testausgabe
    	//cout << "1. Eingabe (Sleep-Zeit): " << eingabe << endl;
    
    	while (s != "stop")
    	{
    		sleep(eingabe);
    
    		// durchlauf zähler mit ausgabe --> hier kann die logik sein...
    		// (das was weiterlaufen soll halt ...)
    		counter++;
    		cout << "Durchlauf: " << counter << "\n";
    
    		cout << "2. Eingabe:";
    		cin >> s;
    	}
    
    	return 0;
    }
    

    oder hab ich was falsch verstanden...?
    du kannst solange eingaben machen bis man "stop" eingibt...

    (mit warten der sleep-eingabe-zeit) kannst die reihen folge der befehle in der while ja wieder ändern...

    wenn dir das nicht reicht hab ich ja oben schon erwähnt nutze ich für soetwas immer async-threads die sich gegenseitig "benachrichtigen" und dann entsprechend reagieren... (asynchron...) 😉

    hoff das hilft dir
    lg



  • Ich hab mal schnell was mit Threads zusammen geworfen:

    #include <iostream>
    #include <string>
    #include <atomic>
    #include <chrono>
    #include <thread>
    
    using namespace std;
    
    // Atomare Variable für die Kommunikation
    atomic_bool continueOutput;
    
    void output_thread()
    {
    	while(continueOutput)
    	{
    		int x = rand() % 1600 + 7;
    		int y = rand() % 900 + 1;
    		cout << x << "	 " << y << endl;
    		this_thread::sleep_for(chrono::milliseconds(5500));
    	}
    }
    
    int main() {
    	srand(time(NULL)); // Einmal srand reicht!
    
    	// Output thread starten
    	continueOutput = true;
    	thread out(output_thread);
    
    	// Auf stop Befehl warten
    	string s;
    	while(s != "stop")
    	{
    		cin >> s;
    	}
    
    	// Thread beenden
    	continueOutput = false;
    	cout << "Warten auf Beenden des Theads..." << endl;
    	out.join();
    
    	return 0;
    }
    

    Gibt sicher noch andere Möglichkeiten das zu realisieren. Ein Nachteil ist noch, dass die Eingabe mit der Ausgabe überlappt wenn man sich zulange beim Tippen Zeit lässt.



  • Danke sebi707. Ich habe noch den Befehl SetCurserPos(x,y) und die Header <windows.h> eingefügt und nun Funktioniert das Programm ganz gut. Jetzt muss ich nur noch lernen was Threads sind und wie man sie einsetzt. Danke.

    ps. Hast du eventuell einen gute Quelle, wo Threads erklärt werden. In meinen Buch, mit welchen ich hauptsächlich lernen, steht dazu nichts, leider.



  • Ich glaube nicht, das du dir mit Threads einen Gefallen tust...



  • win8789 schrieb:

    ps. Hast du eventuell einen gute Quelle, wo Threads erklärt werden. In meinen Buch, mit welchen ich hauptsächlich lernen, steht dazu nichts, leider.

    Programmieren mit mehreren Threads ist eine Wissenschaft für sich und es gibt ganze Bücher darüber. Für einfache Fälle in denen die Threads gar nicht bis wenig kommunizieren müssen wirds einfacher.



  • Ihr tut ja so, als ob es nur Profis vorbehalten ist, so ein Problem lösen zu können.

    Die richtigen Ideen wurden ja genannt, und auch als Anfänger kann man mit 2 Threads umgehen. Und in C++11 ist nicht mal viel dafür nötig. Das Beispiel von Sebi ist einfach und funktionert (habs nicht getestet, aber für mich sieht es gut aus) und sollte einen Anfänger der ein bischen googlen kann auch nicht überfordern.



  • Bengo schrieb:

    Ihr tut ja so, als ob es nur Profis vorbehalten ist, so ein Problem lösen zu können.

    Ja, ist es auch.

    Ohne grundlegendes Wissen über Threads kann man sich extrem leicht in den Fuß schießen, sobald du anfängst Daten zwischen den Threads zu teilen.



  • Bei dem Problem geht es aber nur um eine einzige Information, nämlich dass irgentwer stop eingetippt hat, das sollte ja wohl auch ohne Profiwissen zu händeln sein



  • Nathan schrieb:

    Bengo schrieb:

    Ihr tut ja so, als ob es nur Profis vorbehalten ist, so ein Problem lösen zu können.

    Ja, ist es auch.

    Ohne grundlegendes Wissen über Threads kann man sich extrem leicht in den Fuß schießen, sobald du anfängst Daten zwischen den Threads zu teilen.

    Aber das ist kein Grund als Anfänger die Finger davon zu lassen.

    Blockierende syscalls sind ein reales Problem, das gelöst werden muss. Dabei lernt man vielleicht was...

    Als Profi bevorzuge ich meistens allerdings auch asynchrone IO ggü. Threads.

    Die ganzen Kommentare hier, außer das geposteste Thread-Beispiel, sind mal wieder für die Katz :p


Log in to reply