[c++] Konsolenanwendung CPU

XxbambamxX

Mitglied
Hi zusammen
ich habe in einer c/c++ Konsolenanwendung einen Timer ( gemacht mit GetTickCount())
Code:
loop:long start1 =GetTickCount();
do{
          start =(GetTickCount()-start1)/100;
          if(start==50.... (klicken usw..);
if(start==799)
{goto loop;}

}while(start<800);
und der soll alle so und soviele Sekunden einen Klick ausführen. Eigentlich kein Problem aber blöderweise bekomme ich da(da es eine "endlose do while Schleife" ist) 100%CPU Auslastung.
Diese Schleife wird etwa 1000 mal pro Sekunde durchgerechnet aber 10mal würden mir eigentlich locker reichen. Gibt es da irgendeine Funktion mit der ich die CPU oder die Geschwindikeit des Prozesses bestimmen kann (also quasi dieses programm darf maximal 20% der CPU beanspruchen oder sowas änhliches)?

vielen Dank im Voraus
 
Wie wärs hiermit: http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx
Die Sleep-Funktion hält den Thread an, anstatt dass sie "aktiv wartet".

Es sollte sogar schon was bringen, wenn du das in deine Schleife oben einbaust mit 0 als Parameter, aber eigentlich brauchst du den obigen Code gar nicht mehr...
A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution.
 
Zuletzt bearbeitet:
Hallo,

für diesen Anwendungsfall solltest du besser einen richtigen Timer verwenden, der nach Ablauf des vorgegebenen Intervalls ein Event auslöst bzw. eine Callback-Funktion aufruft.
Schaue dir doch mal die API-Funktion SetTimer() an.

Gruß
MCoder
 
erstmal vielen Dank für die schnellen Antworten!

Aber ich komme irgendwie bei den Links die ihr geschickt habt nicht wirklich draus, da ich (noch:)) nicht alles in Englisch verstehe und nicht weiss welche Dateien ich includen muss usw.
Da Google mir den Syntax und die Includedatei der SetTimer() nicht ausspucken konnte wäre es nett wenn es einer von Euch könnte denn wie gesagt komm ich beim Link nicht wirklich nach und wenn ich die Sprache auf Deutsch geändert habe finde ich die Funktion nichtmehr. :(
 
Die Funktion von engelmarkus:
Sleep: Wartet bestimmte Millisekundenanzahl, bevors weiter geht
Ist allerdings nicht wirklich genau, ein paar ms Abweichung gibts immer
In deinem Fall ist das aber egal, es geht ja nur um die Pause
Include: windows.h
Aufruf: Sleep(123);
Statt 123 halt die entsprechende Zahl

Gruß
 
Hallo,

ich muss mich korrigieren: SetTimer() ist für Konsolenprogramme nicht geeignet, da es eine Windows-Message-Loop benötigt. Stattdessen kann man CreateTimerQueueTimer() verwenden:
C++:
#include <windows.h>
#include <conio.h>
#include <iostream>

VOID CALLBACK WaitOrTimerCallback( PVOID lpParameter, BOOLEAN TimerOrWaitFired);

int main()
{
    HANDLE hTimerQueue = CreateTimerQueue();
    HANDLE hHandle;

    CreateTimerQueueTimer( &hHandle,
                           hTimerQueue,
                           WaitOrTimerCallback,
                           NULL,
                           0,
                           1000, // Timer Intervall
                           WT_EXECUTELONGFUNCTION );

    std::cout << "Beenden mit beliebigen Tastendruck" << std::endl;
    _getch();
    
    DeleteTimerQueueTimer(hTimerQueue, hHandle, NULL);
    return 0;
}

VOID CALLBACK WaitOrTimerCallback(PVOID, BOOLEAN)
{
    std::cout << "Timer Event" << std::endl;
    // TODO: Timer Aktion 
}
Gruß
MCoder
 
Zurück