2013-04-20 28 views
0

我需要執行64秒的操作。每8秒我需要執行一次操作。由於我需要極端的時間精度,我正在使用QueryPerformanceFrequencyQueryPerformanceCounter。如果我想執行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_RUNintcurrentTime-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(&currentTime); 
    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:
計時器有任何問題。問題是由於我使用的索引長於數組的長度。

+0

請定義「不起作用」(給出錯誤信息)。 – JBentley 2013-04-20 15:30:43

+0

對不起。它不會返回任何錯誤消息,但它不會執行我想要的時間。例如,在第一個週期我有這個值。 運行時間:8秒。 當前時間:3032843618. 開始時間:3032843613. DIFF時間:5 <8 在第二週期 當前時間:3032851914 開始時間:3032843613 DIFF時間:8301> 8. 現在 更好? – lezan 2013-04-20 19:56:47

+0

繁忙的等待是如此1960. – 2013-04-20 20:46:22

回答

1

你期待frequency.QuadPart/1000000要做什麼?

我認爲你正在尋找這樣的東西?

LARGE_INTEGER startTime, endTime, freq; 

QueryPerformanceFrequency(&freq); // freq holds the number of ticks in 1 second. 
freq.QuadPart *= 8; // and now in 8 seconds. 

QueryPerformanceCounter(&startTime); 

for(;;) 
{ 
    QueryPerformanceCounter(&endTime); 

    if((endTime.QuadPart - startTime.QuadPart) >= freq.QuadPart) 
    { 
     // 8 seconds have passed. 
     break; 
    } 

    // do something. 
} 
+0

如果我對這個解決方案沒有錯,我等待8秒鐘,然​​後開始對if語句執行總是操作,因爲'endTime.QuadPart - startTime.QuadPart'總是大於等於8 我應該做點別的。我必須運行64秒(例如)一些操作。在這64秒內,我每8秒鐘就要做一次持續一秒的操作。就像 這個http:// pastebin。AC/2363236。 – lezan 2013-04-20 21:56:38

相關問題