Sleep Funktion erstellen
-
Theoretisch könntest du, wenn weisst, wie viele Taktzyklen deine CPU pro Sekunden machen kann, entsprechend viele Operationen ausführen lassen. Z.B. kann deine CPU pro Sekunde 3Mrd. Operationen ausführen. Für 5 Sekudnen machst halt 15 Mrd. Operationen.
In der Praxis wird das aber nicht klappen...
-
Obwohl ist das nicht auch mit for Schleifen möglich?
-
MobUo schrieb:
Obwohl ist das nicht auch mit for Schleifen möglich?
Ja und nein.
Der Compiler optimiert leere for-Schleifen auch gerne mal einfach weg.for(int i=0;i<1000000;++i){ }könnte er ganz wegmachen.
Bisher ein sicheres Mittel dagegen ist
for(int i=0;i<1000000;++i){ cout<<""; }Aber dann haste keine Kontrolle mehr über die Takte.
Hoffe, es reicht, wenn Du den Rechner vorher einfach ausmisst. Also mal bis 1000000 laufen lassen und wenn er dafür 15s braucht, rechnest Du 1000000/15 und hast ne Zeitschleife, die ungefähr eine Sekunde braucht.
-
Also müsste man eigentlich nur nebenbei einen Timer laufen lassen und dann 1000000 durch den Timer teilen
-
Wenn du nen Timer zur Verfügung hast, kannst du den doch gleich für das Sleep benutzen. Ich dachte der Clou wäre, das ganze ohne Timer-Bibliothek zu machen.
Aber mal kurz die Möglichkeiten zusammengefasst:
Es geht nicht.
Und wenn es doch geht, dann nicht ansatzweise portabel.
Und wenn man das hinkriegt, ist es nicht sinnvoll, weil das hochjagen der CPU-Last durch das milliardenfache Abprüfen einer Schleifenbedingung ungefähr das Gegenteil von Schlafen ist.
-
Ist mir auch aufgefallen für einen Timer brauch man ja Sekunden ... Was ist eigentlich dir/der/das QueryPerformanceFrequency?
-
MobUo schrieb:
Also müsste man eigentlich nur nebenbei einen Timer laufen lassen und dann 1000000 durch den Timer teilen
Dachte, Du schaust zum Zeitmessen auf die Armbanduhr und stellst so fest, wie schnell der Rechner ist.
-
@volkard
Zu ungenau
-
Hier hast du mal die Taktfreuqenz:
#include <NTstatus.h> #define WIN32_NO_STATUS #include <windows.h> #include <Powrprof.h> #include <iostream> typedef struct _PROCESSOR_POWER_INFORMATION { ULONG Number; ULONG MaxMhz; ULONG CurrentMhz; ULONG MhzLimit; ULONG MaxIdleState; ULONG CurrentIdleState; } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION; #pragma comment(lib, "Powrprof.lib") int main() { // get the number or processors SYSTEM_INFO si = {0}; ::GetSystemInfo(&si); // allocate buffer to get info for each processor const int size = si.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION); LPBYTE pBuffer = new BYTE[size]; int time = 0; std::cin >> time; PPROCESSOR_POWER_INFORMATION ppi = (PPROCESSOR_POWER_INFORMATION)pBuffer; int hz = (ppi->CurrentMhz * 1000); return 0; }
-
Jetzt brauchst du nur noch eine Schleife bei der du genau weißt wie viele Takte pro durchgang gebraucht werden, kannste mit Inline Assembler oder so basteln.
-
Oh, sorry, das ist taktfrequenz mal Zeit, kann aber keine Beiträge editieren, tu einfach das "* time" in der klammer weg
-
Das ist die "beste" Lösung, die mir einfällt:
void sleep(unsigned seconds) { if (seconds == 0) { return; } if (seconds == 1) { std::cout << "Error E5102 occured. Press [Enter] to continue\n"; } else { std::cout << "Press [Enter] " << (seconds - 1) << " seconds after you read this message\n"; } std::string ignored; std::getline(std::cin, ignored); }
-
@fafdasfasgag: Korrigiert.