如何多线程按下按钮?

How to multithread a button press?

我有一个需要几秒钟的操作阻塞了我的主线程,这冻结了我的 UI。所以,我需要把操作放在一个单独的线程上。

下面模仿了我正在尝试做的事情,但显然不起作用,因为 join() 阻塞直到线程完成。

在按钮按下线程进行操作时允许主线程继续处理 UI 事件的正确方法是什么? (C++17, Windows 10, WxWidgets)

void OnButtonPress()
{
    std::thread t1 = std::thread( []
    {
        std::this_thread::sleep_for( std::chrono::milliseconds(5000) );
    } );

    t1.join();
}

从 GUI 应用程序使用线程的最简单方法是启动线程并立即 return 进入主循环,然后 post 在线程即将终止时触发事件。此事件的处理程序可以加入线程,如果应用程序在线程有时间终止之前关闭,您还需要记住在关闭时执行此操作。

通常最好始终保留一个(或多个)后台工作线程 运行,而不是在按下按钮时启动它并使用消息与其通信(wxMessageQueue 是简单的 class 这对这个很有用)告诉它应该做什么。