控制台应用程序的WinAPI计时器 我有一个C++编写的控制台Windows应用程序,它可以为一个一步一步的游戏找到一个解决方案(或者证明没有解决方案)。让我们称之为“解算器”。该应用程序是在Python脚本的循环中启动的,适用于所有游戏级别。有些级别太难了,需要几个小时甚至几天才能解决

控制台应用程序的WinAPI计时器 我有一个C++编写的控制台Windows应用程序,它可以为一个一步一步的游戏找到一个解决方案(或者证明没有解决方案)。让我们称之为“解算器”。该应用程序是在Python脚本的循环中启动的,适用于所有游戏级别。有些级别太难了,需要几个小时甚至几天才能解决,c++,multithreading,winapi,timer,C++,Multithreading,Winapi,Timer,如果我的应用程序能够输出一些字符串,比如说“太难的级别”,然后退出,从而允许Python脚本进入下一个级别,如果它未能在(比如)30分钟内找到解决方案(或者证明其不存在),那么这是可以接受的 如何在解算器启动30秒后中断解算器?从技术上讲,求解算法只是一个从intmain()调用的递归过程 我正在考虑创建第二个线程,它将在启动30分钟后醒来,并设置一些布尔标志。primiry(求解)线程将定期检查此标志 这是可行的,但是没有更简单更优雅的解决方案吗?因为您的代码不是以消息驱动的方式运行的,所以我

如果我的应用程序能够输出一些字符串,比如说“太难的级别”,然后退出,从而允许Python脚本进入下一个级别,如果它未能在(比如)30分钟内找到解决方案(或者证明其不存在),那么这是可以接受的

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

我正在考虑创建第二个线程,它将在启动30分钟后醒来,并设置一些布尔标志。primiry(求解)线程将定期检查此标志


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

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

在伪代码中:

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

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

#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();
}
#包括
#包括
#包括
UINT_PTR ID=NULL;
void u stdcall OnTimerEvent(HWND HWND,UINT msg,UINT_PTR id,DWORD dwTime)
{

std::coutyou还可以使用
std::chrono::system\u clock::now()捕获开始时间
并检查循环中的时差。但是,您建议的解决方案可能更经济。不过,您必须注意布尔值的同步。@Dmitryletonsov与其说是同步,不如说是错误缓存的危险。任何竞争都是良性的。所需的是原子。可能与此重复:-1“控制台应用程序”和
DispatchMessage
没有重叠。我认为您无法读取控制台应用程序的..”WinAPI计时器"。这正是我给OP的内容。再看一次标签。标签上有Winapi、多线程、计时器。我的解决方案不是最好的,但它具备所有这些功能,并且可以工作。询问者没有要求一个程序演示如何在线程中调用
SetTimer
。我想如果有人看不懂,就是你。仔细阅读问题。再试一次这可能是最好的解决方案;因为你正忙于循环,所以不需要计时器,只需在循环中检查时间。