2017-01-13 3 views
1

Alles ist im Titel :)Wie verlangsamen Sie die Ausführung einer Methode, ohne den Thread/die Anwendung einzufrieren?

Warum brauche ich diese:

ich ein kleines spielbares Sudoku-Spiel in C++ mit Qt erstellt habe. Ich habe eine klassische Backtracking-Methode entwickelt, um das Problem zu lösen. Der Benutzer kann den Fortschritt der Auflösung in Echtzeit sehen. Ich habe einen Schieberegler gesetzt, mit dem der Benutzer die Auflösungsgeschwindigkeit einstellen kann.

Das ist, was ich am Betteln des Auflösungsverfahrens gesetzt habe, den Prozess zu verlangsamen:

sleep_for(milliseconds(delay)); //delay is a toggleable static variable 

aber da der Benutzer die Auflösung startet, kann er nicht die Geschwindigkeit (Verzögerung), weil die Änderung Anwendung schläft die meiste Zeit.

Jede andere Möglichkeit, den Prozess zu verlangsamen?

ps: bitte entschuldigen Sie meine grobe Englisch:/

+0

Sie müssen Qthread verwenden – eyllanesc

+1

Vielleicht könnte QTimer Ihnen helfen. –

Antwort

3

Verwenden Sie timerEvent(). QObject hat eingebaute Timer-Unterstützung. Setzen Sie jeden Spielschritt in das TimerEvent() und rufen Sie startTimer() mit dem erforderlichen Intervall auf. Dies ist bei weitem der einfachste Weg, dies zu tun.

1

Ein Schlaf ist ein guter Weg, um eine Anwendung zu verlangsamen, da es frei ist um den Prozessor andere Dinge zu tun, wenn Sie dem Benutzer erlauben wollen, die Geschwindigkeit zu ändern Sie sollten dies in einem separaten Thread tun, wenn diese Zeit sich ändert, unterbrechen Sie den schlafenden Thread und stellen Sie die neue Verzögerung ein.

+0

Anstatt den schlafenden Thread zu unterbrechen, können Sie auch einfach den Zugriff auf eine gemeinsam genutzte Variable synchronisieren. ('std :: atomic' könnte ausreichen) – qxz

+0

@qxz Angenommen, Sie erlauben einen Bereich von 0-10s für die Schlafoption. Dann kann der Wechsel von 10s auf 0s bis zu 10 Sekunden dauern. Unterbrechen ist eine Möglichkeit, dies zu lösen (es gibt andere). –

-2

Well stellen Sie eine Schleife und rufen die Zug-/Schreibfunktion in einem Satz von Intervall

int interval = 0; 
while(running){ 
    interval++; 
    if(interval == 60){ 
     draw(); 
    } 
} 

oder Schlaf unter Verwendung von einschließlich Windows.h

int fps = 1000/30; 
while(running){ 
    Sleep(fps); 
    draw(); 
} 

oder durch die Kombination von ihnen

int fps = 1000/30; 
int interval = 0; 
while(running){ 
    interval++; 
    Sleep(fps); 
    if(interval == 30){//every more or less 1 sec 
     draw(); 
    } 
} 
+2

Ich würde von Busy-Waits abraten, weil diese, CPU-Zeit verbrauchen, für absolut ** nein ** gewinnen. Timing Kontrolle ist auch schlecht: Sie wissen nicht die genauen magischen Konstanten zu verwenden, in Ihrem busy-Kellner, ohne mit Zahlen herumzuprobieren, vorher, und selbst dann, Sie kennen die magische Konstante für nur eine einzige Maschine. 'Sleep' schläft für genau die Menge (mehr oder weniger) auf jeder Maschine. Und was noch schlimmer ist in Ihren busy-wait-Beispielen, dass die Funktion 'draw' aufgerufen wird, _am meisten_ einmal. –

Verwandte Themen