64 秒間操作を実行する必要があります。8 秒ごとに別の操作を実行する必要があります。極端な時間精度が必要なので、 and を使用QueryPerformanceFrequency
してQueryPerformanceCounter
います。操作を 64 秒または 8 秒間実行したい場合、これらの秒を type でどのように表すことができ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;
動作しません。unsigned long long で 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(¤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:
タイマーに問題があります。問題は、配列の長さよりも長いインデックスを使用したことが原因でした。