我有一个用C ++编写的控制台Windows应用程序,可以为某个逐步游戏找到给定级别的解决方案(或证明不存在解决方案)。我们称之为“求解器”。这个应用程序是从Python脚本循环启动的,适用于所有游戏关卡。有些级别太难了,解决它们需要数小时甚至数天。
如果我的应用程序可以输出一些字符串,说“太难了”并退出,从而允许Python脚本移动到下一级别,如果它找不到解决方案(或证明其不存在),那将是可以接受的比方说,30分钟。
如何在解算器启动30秒后中断解算器?从技术上讲,求解算法只是一个从int main()
调用的递归过程。
我正在考虑创建在启动后30分钟醒来并设置一些布尔标志的辅助线程。并且primiry(求解)线程会定期检查此标志。
这样可行,但是没有更简单的更优雅的解决方案吗?
答案 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();
}