Problem mit QueryPerformanceCounter
-
Hi,
Ich hab mal ein bisschen mit QueryPerformanceCounter in der Konsole rumgetestet, allerdings kann ich das Ergebnis nie ausgeben ....
int main() { LONGLONG t1, t2, f; double time; //welcher Typ muss das sein? int c; QueryPerformanceCounter((LONG_INTEGER*)&t1); //das mit dem LONG_INTEGER hab ich hier gesehen im Forum //Edit: Ich glaube ich meine LARGE_INTEGER for (int i=0; i<1000000000; ++i); c = c + 2; //keine Bedeutung QueryPerformanceCounter((LONG_INTEGER*)&t2); QueryPerformanceFrequency((LONG_INTEGER*)&f); time = (t2-t1)/f; cout << time << endl; return 0; }Das Problem: Wenn ich double time schreibe, bekomme ich 0 als Ausgabe, obwohl die Rechnung schon etwas Zeit erfordert. Wenn ich als time einen LONGLONG benutze, dann gibt er 3 aus ... Vll. sind es drei Sekunden, die es dauert, aber doch nicht genau

Wie bekomme ich es hin, dass ich eine Ausgabe in ms z.B. bekomme?
Ein weiteres Problem: "cout" kann LONGLONGs nicht ausgeben oder?Gruß
-
Oh ich glaube ich meine LARGE_INTEGER, bin gerade nicht mehr sicher

-
Also hier der Code, etwas geändert, aber diesmal gibt er 2 aus

#include <iostream> #include <windows.h> using namespace std; const UINT START_TIMER = WM_USER + 0x101; //Überbleibsel const UINT STOP_TIMER = START_TIMER + 0x101; // || int main() { LARGE_INTEGER f, st, et; LONGLONG ticks; int c = 2; QueryPerformanceFrequency(&f); QueryPerformanceCounter(&st); for (int i = 0; i < 1000000000; ++i) c = c + 2; QueryPerformanceCounter(&et); cout << "Zeit: "; ticks = et.QuadPart-st.QuadPart; ticks /= f.QuadPart; printf("%d\n", (unsigned long)ticks); return 0; }Hoffe ihr könnt mir dabei helfen

-
Das ist eigentlich ein Datentyp, der von Windows.h deklariert wird.
Eigentlich ist es eine Union/Struktur aus, die auch über 2 DWORDs angegeben werden kann.
Sie dir am besten die MSDN Hilfe zu dem Datentyp an, dann weíßt du bescheid, wie man damit rechnet und ihn ausgibt.
-
Also zumindest das untere Codebeispiel hab ich in fast der gleichen Form hier gefunden. Allerdings gibt es da anscheinend was normales aus oO
-
Es bleibt bei meiner Empfehlung, dich mit den Datentypen etwas gründlicher zu beschäftigen, damit so etwas:
for (int i = 0; i < 1000000000; ++i)nicht passiert.
-
Könntest du mir sagen, was daran falsch ist?

Also die Schleife ist doch wohl nciht das Problem, die hab ich schon zwanzigmal benutzt ohne Probleme
und auch mit dem normalen Delphi-Counter in einem externen Programm gemessen (daher auch die selbstdefinierten Nachrichten)...
-
Ok, Asche auf mein Haupt

Ich habe mich um genau eine Ziffer verzählt.
Ich dachte, ich sehe da eine Abfrage nach einer Zahl, die int mit 32 Bit nie erreichen kann...Wenn du es in ms willst, müsstest du es dann wohl so machen:
ticks /= (f.QuadPart / 1000.0);
-
Ahh vielen Dank

Kein Problem das mit dem Verzählen, als du das gesagt hattest hab ich auch nochmal genau nachgezählt ob ich mich nicht hier beim Tippen verhauen hab
Kann ja mal passieren, nächstes Mal wähle ich was einfacheres 
Danke nochmal
Johannes
-
Johannes Maier schrieb:
Kann ja mal passieren, nächstes Mal wähle ich was einfacheres

Und wähle bitte auch das richtige Forum
. Im Moment haben die 3 oberen Threads in diesem Forum nicht das geringste mit C++ an sich zu tun (QueryPerformanceCounter, conio.h, msxml). Das nervt irgendwie...
-
Jo tut mir leid. Aber ich kanns erklären:
Zuerst hieß die Überschrift bei mir: "Problem mit cout: ambigous" da ich dachte, mein Problem würde bei cout liegen, dass es so große Zahlen wie LONGLONG nicht richtig ausgeben könne. Allerdings hab ich es ja dann durch printf() ersetzt und dadurch ging das. Danach kam dann die Frage mit dem Counter auf und dieses Eingabefenster mit Quellcode war noch offen
Also hab ich da weitergeschrieben und nicht daran gedacht, ich könne im falschen Unterforum sein, sorry 
-
Johannes Maier schrieb:
Ein weiteres Problem: "cout" kann LONGLONGs nicht ausgeben oder?
Ja. Da C++ kein long long kennt, muss eine standardkonforme Implementierung von cout das auch nicht berücksichtigen. Trotzdem gibt es Implementierungen die das können. Mit printf unter C gehts dann wie folgt
long long i1 = -100000000000; printf("%lli", i1); unsigned long long i2 = 100000000000; printf("%llu", i2);Das muss aber auch nicht zwangsläufig funktionieren. ZB hatten ältere MS Libs damit Probleme, beim aktuellen Release funktioniert es endlich.
-
Dieser Thread wurde von Moderator/in davie 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.
-
Ich brauche einen Timer, zum Messen wie lange eine Methode dauert.
Ist dafür QueryPerformanceCounter ausreichend?
Oder brauch ich eine Lib? Wenn ja, welche?
Was gibt's für bekannte Libs für Timer?Danke und Gruss
-
was ist denn dein Problem mit der Ausgabe? Versteh garnicht, worum's hier eigentlich grad geht ... Du lässt den Code laufen und gibst danach die Zeit aus: ca 2 Sekunden. Scheint mir ein realisitischer Wert zu sein. Bei mir dauert es zwar 5 Sekunden, aber zumindest bei mir dauert es tatsächlich so lang.
-
dEUs schrieb:
was ist denn dein Problem mit der Ausgabe? Versteh garnicht, worum's hier eigentlich grad geht ... Du lässt den Code laufen und gibst danach die Zeit aus: ca 2 Sekunden. Scheint mir ein realisitischer Wert zu sein. Bei mir dauert es zwar 5 Sekunden, aber zumindest bei mir dauert es tatsächlich so lang.
Hat sich in der Zwischenzeit gelöst
Das mit der Ausgabe war nur ein vorheriges Problem, wie du siehst verwende ich ja printf um den Wert endgültig auszugeben.
Ich hatte halt nur das Problem, dass durch falsche Einstellung nur 2 angezeigt wurde, obwohl es in Wirklichkeit 2935 ms waren
Nur hatte ich bei einer 1000, mit der ich später multipliziert hatte 2000 als Ergebnis bekommen. Dan SeppSchrots Verbesserung geht es aber nun 