Мне нужно выполнить операцию в течение 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(¤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)
, я могу запустить приложение в течение требуемого времени.
EDIT 2:
Есть проблемы с таймером. Проблема была связана с тем, что я использовал индекс, который был длиннее длины массива.
Пожалуйста, определите, что «не работает» (укажите сообщения об ошибках). – JBentley
Извините. Он не возвращает какое-либо сообщение об ошибке, но оно не выполняется на время, которое я хочу. Например, в первом цикле у меня есть эти значения. Время запуска: 8 секунд. Текущее время: 3032843618. время Начало: 3032843613. Diff время: 5 <8 на второй цикл Текущее время: 3032851914 Время Начало: 3032843613 Diff время: 8301> 8. Лучше сейчас? – lezan
Занятые ожидания - так 1960. –