G
@Canon
Ob du eine Stoppuhr oder einen Timer benutzt, ist letztendlich egal. Ich poste einfach mal meine Stoppuhr, vielleicht hilft die dir ja mehr.
// .cpp
class chronometer
{
public:
typedef long long duration_type;
private:
static const duration_type frequency_;
static duration_type query_frequency()
{
LARGE_INTEGER f;
QueryPerformanceFrequency(&f);
return f.QuadPart;
}
static duration_type frequency()
{
return frequency_;
}
public:
static duration_type time_stamp()
{
LARGE_INTEGER c;
QueryPerformanceCounter(&c);
return c.QuadPart;
}
private:
duration_type start_;
duration_type end_;
bool active_;
public:
void reset()
{
if (!active_)
start_ = end_;
else
start_ = time_stamp();
}
void start()
{
if (!active_)
{
start_ += time_stamp() - end_;
active_ = true;
}
}
void stop()
{
if (active_)
{
end_ = time_stamp();
active_ = false;
}
}
duration_type elapsed_milliseconds() const
{
duration_type tmp;
if (!active_)
tmp = end_ - start_;
else
tmp = time_stamp() - start_;
return tmp * 1000 / frequency();
}
chronometer()
: start_(0)
, end_(0)
, active_(false)
{
}
~chronometer()
{
}
};
// .h
const chronometer::duration_type chronometer::frequency_ = chronometer::query_frequency();
Die Klasse ist eigentlich etwas komplexer, ich hab sie nur auf's wesentliche gekürzt. Solltest du also Fehler entdecken, ruhig nachfragen. Wenn du die Zeit für zB Sekunden brauchst, solte es auch kein Problem sein, eine entsprechende Funktion einzubauen.
Aufgerufen wird das ganze dann wie folgt:
chronometer cm;
cm.start(); // Stoppuhr wurde gestartet
//...
cm.elapsed_milliseconds(); // bisher abgelaufene Millisekunden abfragen (Stoppuhr laeuft weiter)
//...
cm.stop(); // Stoppuhr wurde angehalten
//...
cm.elapsed_milliseconds(); // bis zum Stop abgelaufene Millisekunden abfragen
//...
cm.reset(); // Stoppuhr wurde auf 0 zurückgesetzt
Man sollte noch erwähnen, dass die QueryPerformance...-Funktionen einen Rückgabewert liefern, der angibt, ob das System überhaupt über solche Counter verfügt. Willst du also für das Fehlen solcher Counter gewappnet sein, dann würde ich empfehlen eine Funktion zu schreiben, die das abfragt und einmalig zu Beginn des Programms aufgerufen wird. Afaik sollte diesbezüglich bei modernen Rechnen aber keine Probleme auftreten. Höchstens bei sehr alten Rechnern (486er & co) ist damit zu rechnen.