Как я могу представить определенное количество секунд (минут) с типом unsigned long long int в переполнении стека

Мне нужно выполнить операцию в течение 64 секунд. Каждые 8 ​​секунд мне нужно выполнять еще одну операцию. Так как мне нужна чрезвычайная временная точность, я использую QueryPerformanceFrequency а также QueryPerformanceCounter, Если я хочу выполнить операцию в течение 64 секунд или 8 секунд, как я могу представить эти секунды с типом 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;

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

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

РЕДАКТИРОВАТЬ:
Я не могу решить эту проблему.

#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

Решение

Что вы ожидаете 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.
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]