2013-04-20 1 views
0

Мне нужно выполнить операцию в течение 64 секунд. Каждые 8 ​​секунд мне нужно выполнить другую операцию. Поскольку мне нужна предельная временная точность, я использую QueryPerformanceFrequency и QueryPerformanceCounter. Если бы я хотел выполнить операцию в течение 64 секунд или 8 секунд, как я могу представить эти секунды с типом unsigned long long int? , когда я не нужна эта точность, я сделал что-то вроде этого:Как я могу представить определенное количество секунд (минут) с типом unsigned long long int в C++

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; 

не работает. Как я могу представить восемь секунд с unsigned long long.

Спасибо за ответы.

EDIT: Я не могу решить эту проблему.

#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), я могу запустить приложение в течение требуемого времени.

EDIT 2:
Есть проблемы с таймером. Проблема была связана с тем, что я использовал индекс, который был длиннее длины массива.

+0

Пожалуйста, определите, что «не работает» (укажите сообщения об ошибках). – JBentley

+0

Извините. Он не возвращает какое-либо сообщение об ошибке, но оно не выполняется на время, которое я хочу. Например, в первом цикле у меня есть эти значения. Время запуска: 8 секунд. Текущее время: 3032843618. время Начало: 3032843613. Diff время: 5 <8 на второй цикл Текущее время: 3032851914 Время Начало: 3032843613 Diff время: 8301> 8. Лучше сейчас? – lezan

+0

Занятые ожидания - так 1960. –

ответ

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

Смежные вопросы