我需要執行64秒的操作。每8秒我需要執行一次操作。由於我需要極端的時間精度,我正在使用QueryPerformanceFrequency
和QueryPerformanceCounter
。如果我想執行64秒或8秒的操作,那麼我怎樣才能用unsigned long long int
類型表示這些秒數? 時,我並不需要這個精度,我做了這樣的事情:如何使用C++中的unsigned long long int類型來表示某個秒數(分鐘)
const int TIME_TO_RUN= 64;
time_t startTime = 0;
...
time (& startTime);
while (difftime (time (NULL), startTime) <TIME_TO_RUN) {
do something
}
現在我這樣做。
typedef unsigned long long int accurateTime;
//GetCurrentTime void (* accurateTime time) {
void GetCurrentTime(accurateTime *time) {
LARGE_INTEGER frequency, currentCount;
QueryPerformanceFrequency (& frequency);// Units is (counts/sec)
QueryPerformanceCounter (& currentCount);
* time = (accurateTime) (currentCount.QuadPart/(frequency.QuadPart/1000000));
}
int main() {
accurateTime startTime = 0;
accurateTime CurrentTime = 0;
...
GetCurrentTime (& startTime);
while (true) {
GetCurrentTime (& currentTime);
if (currentTime-startTime <TIME_TO_RUN) {
do something...
}
}
}
顯然,在這種情況下不起作用,因爲TIME_TO_RUN
是int
和currentTime-startTime
返回unsigned long long int
。 如果聲明TIME_TO_RUN
作爲
const unsigned long long int TIME_TO_RUN = 8;
不起作用。我如何用無符號long long表示八秒鐘。
感謝您的回答。
編輯: 我無法解決這個問題。
#define NUMBER_STIMULI 8
#define DURATION_STIMULI 7
#define TIME_WAIT 1
#define SELECT_STIMULI_TIME 4
#define TIME_TO_RUN NUMBER_STIMULI*(DURATION_STIMULI + TIME_WAIT + SELECT_STIMULI_TIME)
...
LARGE_INTEGER startTime, currentTime, timeToRun, waitTime, lastWaitTime, stimuliTime, lastStimuliTime, endTime, frequency, selectStimuliTime, lastSelectStimulitiTime;
QueryPerformanceFrequency(&frequency);
QueryPerformanceFrequency(&waitTime);
waitTime.QuadPart*=TIME_WAIT;
QueryPerformanceFrequency(&selectStimuliTime);
selectStimuliTime.QuadPart*=SELECT_STIMULI_TIME;
QueryPerformanceFrequency(&stimuliTime);
stimuliTime.QuadPart*=(TIME_WAIT+DURATION_STIMULI+SELECT_STIMULI_TIME);
QueryPerformanceFrequency(&timeToRun);
timeToRun.QuadPart*=TIME_TO_RUN;
...
QueryPerformanceCounter(&startTime);
for(;;) {
QueryPerformanceCounter(¤tTime);
if(currentTime.QuadPart-startTime.QuadPart<timeToRun.QuadPart) { //run for 96 seconds
if((currentTime.QuadPart-lastStimuliTime.QuadPart>=stimuliTime.QuadPart) { each 12 seconds
QueryPerformanceCounter(&lastStimuliTime);
QueryPerformanceCounter(&lastSelectStimulitiTime);
}
else { //for 12 seconds
if((currentTime.QuadPart-lastSelectStimulitiTime.QuadPart<selectStimuliTime.QuadPart)) { //wait for 4 seconds
QueryPerformanceCounter(&lastWaitTime);
}
else {
if(currentTime.QuadPart-lastWaitTime.QuadPart<waitTime.QuadPart) { //wait for 1 second
}
else { for 7 seconds
make something;
}
}
}
}
}
在這個例子中,我需要運行96秒。每12秒我需要改變目標。在這12秒鐘內,我需要4秒鐘休息1秒鐘等待一些變化。最後7秒我需要執行一些操作。
問題是應用程序不能運行96秒,但會在幾秒鐘後結束。當應用程序終止時,我不會收到任何錯誤。
在我已經使用這個if (currentTime.QuadPart-startTime.QuadPart <timeToRun.QuadPart)
的另一個應用程序中,我可以運行該應用程序所需的時間。編輯2:
計時器有任何問題。問題是由於我使用的索引長於數組的長度。
請定義「不起作用」(給出錯誤信息)。 – JBentley 2013-04-20 15:30:43
對不起。它不會返回任何錯誤消息,但它不會執行我想要的時間。例如,在第一個週期我有這個值。 運行時間:8秒。 當前時間:3032843618. 開始時間:3032843613. DIFF時間:5 <8 在第二週期 當前時間:3032851914 開始時間:3032843613 DIFF時間:8301> 8. 現在 更好? – lezan 2013-04-20 19:56:47
繁忙的等待是如此1960. – 2013-04-20 20:46:22