Console schleife...



  • Hey,
    ich wollte gerne mein auskommentierten Code jede Sekunde erneuert haben so das ich immer sehe wie viel Golc ich gerade habe.Nur verwirrt mich die Console ein wenig und ich weis nicht ob es überhaut möglich ist meine Variable sekündlich zu aktualisieren und gleichzeitig noch andere eingaben zu machen.

    #include <iostream>
    using namespace std;
    
    void wait();
    
    int main()
    {
    	int Gold = 0;
    
    	//Der Auskommentierte Code soll sich sekündlich neu abspielen.
    	/*  
    	cout << "Gold: " << Gold << endl;
        system("cls");
    	*/
    
    	wait();
    	return 0;
    }
    
    void wait()
    {
    	cout << endl;cout << endl;
    	cout << "<Press [Enter] to close>";
    
    	cin.clear();
    	cin.ignore(cin.rdbuf()->in_avail());
    	cin.get();
    }
    


  • int main()
    {
       int gold = 0;
       unsigned int t1 = 0;
       while ( true )
       {
           if ( GetTickCount() - t1 >= 1000 )
           {
                system("CLS");
                cout << gold;
                t1 = GetTickCount();
           }
       }
    }
    

    (ungetestet, nicht portabel, schmutzig, nichts bringend und ohne template metaprogrammierung die hoffendlich früher oder später hier auftauchen wird ;))

    edit: das was du vorhast wird nicht klappen...
    und mit einer eingabe dabei wird auch schwerer... (es geht aber mach erstmal einfachere sachen)



  • Wenn du mehrere Dinge parallel machen willst, benötigst du Threads. Multithreading ist aber ein sehr komlexes Thema, daher würde ich dir raten, etwas anderes zu machen.



  • Ich weiß nicht direkt warum du dass willst, aber ich würde es so machen:

    #include <iostream>
    #include <windows.h>
    
    char szcmd[] = {"cls"};
    int Gold = false;
    bool run = true;
    
    unsigned long __stdcall UpdateRoutine( void * _p )
    {
       while( run )
       {
         cout << gold << endl;
         system(szcmd);
         Sleep(1000); //1sek
       }
       return true;
    }
    
    void main( void )
    {
        HANDLE hThread = false;
        if( (hThread = CreateThread( 0, 0, UpdateRoutine, 0, 0, 0 )) )
        {
             cout << "druecke enter um das programm zu beenden!\n"<< endl;
             getchar();
             run = false;
        }
    }
    

    Habe den Code nicht getestet. Ohne Gewähr.



  • Erstens hinterlässt CreateThread ein Memory-Leak, zweitens ist deine Variante so ziemlich das hässlichste, was möglich ist, noch dazu hast du nichts gegen Race Conditions getan.



  • 314159265358979 schrieb:

    Erstens hinterlässt CreateThread ein Memory-Leak, zweitens ist deine Variante so ziemlich das hässlichste, was möglich ist, noch dazu hast du nichts gegen Race Conditions getan.

    Ich entschuldige mich, wenn ich gegen deine Programmier-Vorstellungen verstoßen habe. Dieser Quelltext sollte zur Veranschaulichung helfen.



  • Ich glaube nicht, dass ein Anfänger etwas mit Threads machen möchte. Vielmehr denke ich, dass er genau das hier machen will:

    #include <iostream>
    #include <windows.h> //für GetAsyncKeyState()
    #include <ctime> //für clock()
    
    using namespace std;
    
    int main() 
    { 
    	int gold = 0; 
    	unsigned int t1 = 0;
    	bool beenden = false;
    
    	while(!beenden) 
    	{
            //Zahlen 0-9 prüfen und goldwert ändern
    		for(int i = '0'; i <= '9'; ++i)
    			if(GetAsyncKeyState((char)i))
    				gold = i - '0';
    
            //Jede Sekunde ausgeben
    		if (clock() - t1 >= 1000)
    		{ 
    			cout << gold << "\n"; //beliebige Ausgabe
    			t1 = clock(); 
    		} 
    
    		//Beenden mit ESC-Taste
    		if(GetAsyncKeyState(VK_ESCAPE))
    			beenden = true;
    	} 
    }
    

    Abgewandelte Form von Skym0sh0.



  • 314159265358979 schrieb:

    Erstens hinterlässt CreateThread ein Memory-Leak, zweitens ist deine Variante so ziemlich das hässlichste, was möglich ist, noch dazu hast du nichts gegen Race Conditions getan.

    Anstatt nur zu kritisieren, könntest du ja auch mal mit Gegenvorschlägen kommen (wie z.B. "_beginthread statt CreateThread")...



  • HighLigerBiMBam schrieb:

    Ich glaube nicht, dass ein Anfänger etwas mit Threads machen möchte. Vielmehr denke ich, dass er genau das hier machen will:

    #include <iostream>
    #include <windows.h> //für GetAsyncKeyState()
    #include <ctime> //für clock()
    
    using namespace std;
    
    int main() 
    { 
    	int gold = 0; 
    	unsigned int t1 = 0;
    	bool beenden = false;
    
    	while(!beenden) 
    	{
            //Zahlen 0-9 prüfen und goldwert ändern
    		for(int i = '0'; i <= '9'; ++i)
    			if(GetAsyncKeyState((char)i))
    				gold = i - '0';
    
            //Jede Sekunde ausgeben
    		if (clock() - t1 >= 1000)
    		{ 
    			cout << gold << "\n"; //beliebige Ausgabe
    			t1 = clock(); 
    		} 
    
    		//Beenden mit ESC-Taste
    		if(GetAsyncKeyState(VK_ESCAPE))
    			beenden = true;
    	} 
    }
    

    Abgewandelte Form von Skym0sh0.

    cool danke erstmal fürs zitieren. ich fühle mich geehrt 🙂

    ja so in der richtung hätte ichs auch gemacht, aber vielleicht ehr mit einer verbindung aus kbhit und getch

    int input = 0;
    
    while (true)
    {
        // ... geld ausgeben ;)
        if ( _kbhit() )
        {
             input = _getch();
             // auf input reagieren
        }
        // ... rest
    }
    

    man beachte das wortspiel 🙂


Log in to reply