Per Tastendruck While Schleife starten und verlassen bevor das Ende der Schleife erreicht ist



  • Hi Leute,
    google jetzt schon seit 2 Stunden und bin immer noch nicht schlauer. Wisst ihr ob es eine Möglichkeit gibt eine While Schleife direkt zu verlassen ohne darauf zu warten das sie einmal durchlaufen wurde? Ich möchte sie starten wenn ich a drücke und auch wieder verlassen beim zweiten drücken von a.
    Mein Code sieht wie folgt aus:

    int main()
    {
    	while (TRUE)
    	{
    		if (GetKeyState(0x41) & 1) //start loop by pressing 'a'
    		{
    			running = TRUE;
    		}
    		thread t1(loop); //execute first line of loop
    		running = FALSE;
    		t1.join(); //resume thread
    	}
    }
    
    void loop()
    {
    	while (running == TRUE)
    	{
    		color_a = getpixelcolor(x,y);
                    color_xz = getpixelcolor(b1,d5);
                    color_k9 = getpixelcolor(a1,b2);
                    ..
            }
    }
    

    Das funktioniert soweit auch aber ich muss nach Tastendruck immer erst darauf warten das alle Farben initialisiert wurden. Meine Ausweichmöglichkeit sieht derzeit so aus:

    void loop()
    {
    	while (running == TRUE)
    	{
    		color_a = getpixelcolor(x,y);
                    if (GetKeyState(0x41) & 1) break; //end loop with 'a'
                    color_xz = getpixelcolor(b1,d5);
                    if (GetKeyState(0x41) & 1) break; //end loop with 'a'
                    color_k9 = getpixelcolor(a1,b2);
                    if (GetKeyState(0x41) & 1) break; //end loop with 'a'
                    ..
            }
    }
    

    Finde ich aber extrem uncool weil das ganz schön viele Farben sind ^^. Meine erste Idee war es das über 2 Threads zu lösen wobei der eine den anderen killt wenn 'A' gedrückt wird. hab aber auch keinen Befehl gefunden der externe Threads killt. Wisst ihr ob es eine bessere Art gibt das zu lösen? Bin um jede Hilfe dankbar 🙂 Programmiere mit Visual Studio und bin noch nicht allzu erfahren 😃



  • @Lunte sagte in Per Tastendruck While Schleife starten und verlassen bevor das Ende der Schleife erreicht ist:

    hab aber auch keinen Befehl gefunden der externe Threads killt.

    Ich weiß zwar nicht was "extern" bedeutet, aber std::terminate().

    // aja, wenn Du 'a' meinst, dann schreib' auch 'a'.



  • Meinte damit nicht aus dem eigenen Thread heraus sondern aus einem anderem Thread heraus. Bin echt noch ein Anfänger. Wie genau schreibe ich den Befehl damit ich den Thread t1 kille?

    // aja, wenn Du 'a' meinst, dann schreib' auch 'a'.

    kA was du damit meinst wollt damit nur deutlich machen das ich einen tastendruck meine



  • Ich meine, daß Du statt 0x41 bitte 'a' schreiben sollst.

    t1.native_handle() gibt Dir ein Handle zum Thread, das Du dann an TerminateThread() füttern kannst.



  • achso 😃 jo ok danke ich schau mir dann nochmal was zum thema threads an



  • @Swordfish sagte in Per Tastendruck While Schleife starten und verlassen bevor das Ende der Schleife erreicht ist:

    Ich meine, daß Du statt 0x41 bitte 'a' schreiben sollst.

    Ox41 ist aber 'A'



  • @DirkB dann schreib' 'A' ^^



  • @Lunte: Dauert denn ein Schleifendurchgang (bzw. die Funktion getpixelcolor) in Loop so lange, daß es stören würde, nur einmalig abzufragen?
    Ansonsten könntest du natürlich auch zwei Schleifen benutzen (wenn du die color_...-Werte als ein Array hinterlegst) und in der inneren Schleife zusätzlich auf den Tastendruck abfragst.

    Warum du hier (bei einem Konsolenprogramm) mit Threads arbeiten willst, ist mir völlig schleierhaft?!
    Einen Thread zu starten und abzuschießen dauert sicherlich länger als ein Schleifendurchlauf.

    PS: Um wie viele Farbwerte handelt es sich denn? Wohl mehr als die drei? Alleine deswegen sollte wohl ein Array benutzt werden...



  • @Th69
    hey danke für die antwort. ja dauert schon etwas länger und ich wollte es gerne zu jederzeit stoppen können. naja ich will nicht mit threads arbeiten, das war nur eine idee um den vorgang schnell abbrechen zu können ohne tonnenweise break abfragen schreiben zu müssen. das mit dem array ist aber eine sehr gute idee und ich werds wahrscheinlich jetzt auch so machen 🙂 hatte übrigens noch was interessantes gefunden zum gleichen thema: https://stackoverflow.com/questions/28655279/is-it-possible-to-check-a-condition-after-every-method-in-a-loop-if-so-how


Log in to reply