2017-12-05 24 views
-3

Ich möchte ein Programm machen, in dem zwei Punkte gleichzeitig blinken (mit einer Pause von 10ms), aber eine mit Verzögerung 200ms und andere mit Verzögerung von 300ms. Wie kann ich diese zwei Punkte gleichzeitig von Anfang an spielen? Gibt es eine bessere Art und Weise zu, dass aus folgenden:Führen Sie zwei Verzögerungen auf einmal aus C++

for(int i=1;i<100;i++) 
{ 
    if (i%2==0) 
    circle(10,10,2); 
    if (i%3==0) 
    circle(20,10,2); 
    delay(10); 
    cleardevice(); 
    delay(100); 
} 
+6

TurboC Ändern ++? Sind Sie sicher, dass Sie diesen alten Compiler verwenden möchten? –

+0

Ja, ich bin ein Anfänger und möchte nur das verwenden –

+0

Verwenden Sie keine Verzögerung gibt es viele Möglichkeiten, Zeit C++. Versuchen Sie, Chrono und verwandte Gegenstände zu betrachten. Warte ... das ist C++ 11 ... Ich bezweifle, dass TurboC++ das kann ... – Matt

Antwort

0

ich so etwas wie dies stattdessen tun würde:

int t0=0,t1=0,t=0,s0=0,s1=0,render=1; 
for (;;) 
{ 
if (some stop condition like keyboard hit ...) break; 
// update time, state 
if (t>=t0) { render=1; s0=!s0; if (s0) t0+=10; else t0+=200; } 
if (t>=t1) { render=1; s1=!s1; if (s1) t1+=10; else t1+=300; } 
// render 
if (render) 
    { 
    render=0; 
    cleardevice(); 
    if (s0) circle(10,10,2); 
    if (s1) circle(20,10,2); 
    } 
// update main time 
delay(10); // Sleep(10) would be better but I am not sure it is present in TC++ 
t+=10; 
if (t>10000) // make sure overflow is not an issue 
    { 
    t -=10000; 
    t0-=10000; 
    t1-=10000; 
    } 
} 

Passen Sie den Code nicht getestet ist, wie ich es direkt hier geschrieben (so könnte es Syntax Fehler oder Tippfehler). Die Grundidee ist eine globale Zeit t mit klein genug Granularität (10ms). Und für jedes Objekt haben Zeit des Ereignisses (t0,t1) Zustand des Objekts (s0,s1) und Perioden (10/200 , 10/300).

Wenn die Hauptzeit die Ereigniszeit erreicht, tauschen Sie den Status ein/aus und aktualisieren Sie die Ereigniszeit auf die nächste Zustandsaustauschzeit.

Auf diese Weise können Sie eine beliebige Anzahl von Objekten nur sicherstellen, dass Ihr Hauptzeitschritt klein genug ist.

Das Render-Flag stellt nur sicher, dass die Szene nur bei Änderung gerendert wird.

Timing verbessern Sie RDTSC statt t+=10 und tatsächlich messen, wie viel Zeit vergangen ist mit CPU Frequenzgenauigkeit verwenden können.

0

Um die beiden Kreise gleichzeitig in der ersten Runde anzuzeigen, müssen Sie beide Bedingungen i%2==0 und i%3==0 gleichzeitig erfüllen. Sie können es einfach erreichen, indem

for(int i=1;i<100;i++) 

zu

for(int i=0;i<100;i++) 
//  ↑ zero here 
Verwandte Themen