timerdauer stimmt nicht



  • Ich bin auf ein eigenartiges Problem gestoßen
    Wenn ich mein Programm(ein kleines Spiel) öffne, und zugleich das Programm im C++-Builder geöffnet habe, dann funktioniert alles problemlos.
    Wenn ich aber das Programm ohne den C++-Builder öffne, dann läuft alles deutlich langsamer ab:

    verwende dem Timer folgendermaßen:

    HANDLE hTimer = NULL;
    LARGE_INTEGER liDueTime;
    liDueTime.QuadPart = (-10000000/(20*(4+optionwert[0])));
    hTimer = CreateWaitableTimer(NULL, TRUE, "WaitableTimer");
    SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0);

    ...

    WaitForSingleObject(hTimer, INFINITE);

    optionwert[0] soll die Geschwindigkeit einstellen und vorher wird der Wert zugewiesen
    Wenn ich jetzt ohne den C++-Builder das Programm starte, dann läuft das Spiel aber mit der geschwindigkeit ab, als ob optionwert[0]=1, egal ob optionwert[0]=1 oder optionwert[0]=9, aber der Wert von liDueTime.QuadPart stimmt mit dem gewollten Wert überein.
    Wo liegt das Problem?



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Naja, bei optionwert[0] == 1 bist du auf 10ms und bei optionwert[0] == 9 auf 3,8ms.
    Windows tickt normalerweise mit ~15ms (je nach Version leicht unterschiedlich), also zu langsam für deine kurzen Wartezeiten.

    Was du versuchen kannst, ist die "Auflösung" von Windows mittels timeBeginPeriod() hochzusetzen.
    http://msdn.microsoft.com/en-us/library/dd757624(VS.85).aspx

    int main()
    {
        int timerPeriod = 0;
        for (int i = 1; i < 10; i++)
        {
            if (::timeBeginPeriod(i) == TIMERR_NOERROR)
            {
                timerPeriod = i;
                break;
            }
        }
    
        RestVomProgramm();
    
        if (timerPeriod)
            ::timeEndPeriod(timerPeriod);
    }
    

    EDIT: fehler im code korrigiert



  • Warum machst Du da eine for-Schleife???



  • eigenartig finde ich, dass es manchmal auch ohne geöffneten C++-Builder richtig funktioniert(mit Wartezeit ungefähr 5ms) und manchmal nicht
    außerdem, wenn ich bei "liDueTime.QuadPart = (-10000000/(20*(4+optionwert[0])));"
    statt "20*(4+optionwert[0])" "40*(4+optionwert[0])" eingebe, dann läuft das Programm doppelt so schnell ab, aber eben auch langsamer als es eigentlich sollte und über optionwert[0] kann ich die Geschwindigkeit nicht ändern
    deshalb kann das Problem eigentlich nicht an der Auflösung von Windows liegen



  • Es war doch die Auflösung des Timers. Danke für die Hilfe!



  • Jochen Kalmbach schrieb:

    Warum machst Du da eine for-Schleife???

    Ich glaube die fixe 1 sollte wohl eher i sein.
    (Iteriere bis von 1 bis 9 und versuche es zu setzen falls es nicht klappt versuch es noch mal etc bis es das erste mal klappt => break;)



  • evilissimo schrieb:

    Jochen Kalmbach schrieb:

    Warum machst Du da eine for-Schleife???

    Ich glaube die fixe 1 sollte wohl eher i sein.
    (Iteriere bis von 1 bis 9 und versuche es zu setzen falls es nicht klappt versuch es noch mal etc bis es das erste mal klappt => break;)

    ooops, ja, genau das.
    habs korrigiert 🙂


Anmelden zum Antworten