如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)

Posted

技术标签:

【中文标题】如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)【英文标题】:How can I represent a certain number of seconds (minutes) with the type unsigned long long int in C++ 【发布时间】:2013-04-20 15:13:52 【问题描述】:

我需要执行 64 秒的操作。每 8 秒我需要执行另一个操作。因为我需要极端的时间精度,所以我使用QueryPerformanceFrequencyQueryPerformanceCounter。如果我想执行 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 是一个intcurrentTime-startTime 返回一个unsigned long long int。 如果将TIME_TO_RUN 声明为

const unsigned long long int TIME_TO_RUN = 8;

不起作用。如何用 unsigned 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 &lt;timeToRun.QuadPart) 的另一个应用程序中,我可以在所需的时间内运行该应用程序。

编辑 2: 计时器有任何问题。问题是由于我使用的索引比数组的长度长。

【问题讨论】:

请定义“不起作用”(给出错误信息)。 对不起。它不会返回任何错误消息,但不会在我想要的时间内执行。例如,在第一个周期我有这个值。运行时间:8 秒。当前时间:3032843618。开始时间:3032843613。Diff time:5 8。现在好点了吗? 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.

【讨论】:

如果我对这个解决方案没有错,我会等待 8 秒,然后开始对 if 语句执行总是操作,因为 endTime.QuadPart - startTime.QuadPart 总是大于等于 8。我应该做点别的.我必须运行 64 秒(例如)一些操作。在这 64 秒内,每 8 秒我必须做一个持续一秒的操作。像这样pastebin.ca/2363236.

以上是关于如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)的主要内容,如果未能解决你的问题,请参考以下文章

带有 unsigned long long 和 sprintf 的 Visual C++ 6.0

JAVA 与 C++ 数据类型转换 byte unsigned char

如何在实体框架中使用 unsigned int / long 类型?

如何在 MongoDB 文档中存储 unsigned long long (uint64_t) 值?

C++ 指针(不论什么一个指针本身的类型都是unsigned long int型)

如何在 C 中打印“unsigned long”?