C++ WinAPI事件(偶数秒)

C++ WinAPI事件(偶数秒),c++,c,winapi,C++,C,Winapi,我需要编写一个应用程序,等待系统时间达到甚至秒 例如,我需要一个18:00:00的事件,下一个18:00:01等。轮询系统时钟效率低下 目前我使用的是TimerQueueTimer,但它只允许您等待时间,例如1000毫秒,而不是确切的时间。我建议: #include <time.h> while(true){ clock_t cl = clock(); // do your things... cl = clock()-cl; Sleep /* or your sleep func

我需要编写一个应用程序,等待系统时间达到甚至秒

例如,我需要一个18:00:00的事件,下一个18:00:01等。轮询系统时钟效率低下

目前我使用的是TimerQueueTimer,但它只允许您等待时间,例如1000毫秒,而不是确切的时间。

我建议:

#include <time.h>

while(true){
clock_t cl = clock();
// do your things...
cl = clock()-cl;
Sleep /* or your sleep function */ (CLOCKS_PER_SEC-cl);
}
#包括
while(true){
时钟=时钟();
//做你的事。。。
cl=时钟()-cl;
睡眠/*或您的睡眠功能*/(每秒时钟);
}

这几乎是100%准确的

假设:你不在乎抖动跳过多少间隔

long long time1 = 0;
long long time2;
SYSTEMTIME st;
MSG msg;
while (1) {
    GetSystemTime(&st);
    time2 = (((((long long)st.wYear) * 12 + (long long)st.wMonth) * 31 + (long long)st.wDay) * 24 + (long long)st.wHour) * 60 + (long long)st.wMinute) * 30 + (st.wSecond >> 1);
    if (time != time2) {
        /* Handle event */
        /* Will get here at the next possible CPU cycle after the clock crosses 2 seconds */
    } else {
        if (WAIT_OBJECT_0 == MsgWaitForMultipleObjects(0, NULL, FALSE, 2000 - (st.wSecond & 1) * 1000 + st.wMillisecond, QS_ALLINPUT) {
            if (!GetMessage(&msg, NULL, 0, 0)) break; /* WM_QUIT */
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}
exit(msg.wParam);

获取当前时间,让它等待剩余的时间直到指定的时间。对我来说,“偶数秒”实际上是偶数秒,即每秒。比如
18:00:00
18:00:02
18:00:04
等等。你的意思似乎是一个每秒调用一次的计时器?不管怎样,你几乎总是会有一些计时器的偏差。不过,它是可以检测到的,只要稍微小心,它就可以缓解,这样你就不会跳过一秒钟(比如一个事件发生在
18:00:09.999
,下一个事件发生在
18:00:11.001
)。对于大多数用例来说,这样的小偏差是不相关的,用户无法检测到,所以你可能不应该关心它。要么使用它,要么看看它的实现以获得灵感。我不认为
时钟
是正确的方法<代码>时钟从与进程启动时间相关的历元开始计数,因此根据墙时间,时钟的整秒可能与整秒不一致。此外,该标准规定,
clock
统计进程使用的处理器时间,如果进程未计划运行,则处理器时间可能小于实际经过的时间(尽管我认为Windows实际上没有这样做)。最后,
时钟的单位不一定是毫秒。