控制台应用程序的WIN API计时器

时间:2013-11-13 16:26:22

标签: c++ multithreading winapi timer

我有一个用C ++编写的控制台Windows应用程序,可以为某个逐步游戏找到给定级别的解决方案(或证明不存在解决方案)。我们称之为“求解器”。这个应用程序是从Python脚本循环启动的,适用于所有游戏关卡。有些级别太难了,解决它们需要数小时甚至数天。

如果我的应用程序可以输出一些字符串,说“太难了”并退出,从而允许Python脚本移动到下一级别,如果它找不到解决方案(或证明其不存在),那将是可以接受的比方说,30分钟。

如何在解算器启动30秒后中断解算器?从技术上讲,求解算法只是一个从int main()调用的递归过程。

我正在考虑创建在启动后30分钟醒来并设置一些布尔标志的辅助线程。并且primiry(求解)线程会定期检查此标志。

这样可行,但是没有更简单的更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:2)

由于您的代码没有以消息驱动方式运行,我不确定此处是否需要计时器,或者甚至是合适的。您可能需要主计算线程定期检查是否需要超时。在这种情况下,不需要另一个带有计时器的线程。只需记住计算开始的时间,每次检查超时时,看看是否已经过了30秒。

在伪代码中:

startTime = now();
while (doingCalc)
{
    DoSomeMoreCalc();
    if (now() - startTime) > 30.0)
        timeOut();
}

答案 1 :(得分:0)

不确定这是否有效,但值得一试......

#include <windows.h>
#include <iostream>
#include <thread>

UINT_PTR ID = NULL;

void __stdcall OnTimerEvent(HWND hwnd, UINT msg, UINT_PTR id, DWORD dwTime)
{
    std::cout<<"HERE\n";
    KillTimer(NULL, ID);
}

int main()
{
    std::thread([] {
        MSG msg = {0};
        ID = SetTimer(NULL, 0, 3000, &OnTimerEvent); //3 second timer.

        while(GetMessage(&msg, NULL, 0, 0))
        {
            DispatchMessage(&msg);
        }

        KillTimer(NULL, ID);
    }).detach();

    std::cin.get();
}