0

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

如果我的应用程序可以输出一些字符串,例如“太难级别”并退出,从而允许 Python 脚本进入下一个级别,如果它未能找到解决方案(或证明其不存在),例如, 30分钟。

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

我正在考虑创建辅助线程,该线程将在启动后 30 分钟唤醒并设置一些布尔标志。主要(解决)线程会定期检查这个标志。

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

4

2 回答 2

2

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

在伪代码中:

startTime = now();
while (doingCalc)
{
    DoSomeMoreCalc();
    if (now() - startTime) > 30.0)
        timeOut();
}
于 2013-11-13T16:30:02.903 回答
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();
}
于 2013-11-13T16:55:45.333 回答