用C++如何停止睡眠()线程?
我正在创建一个将应用程序休眠1000毫秒的代码,我希望在左键单击鼠标按钮时完成休眠线程。我现在已经开始工作了,但我希望能够让睡眠线程只发生一次,然后在按下键后停止睡眠。用C++如何停止睡眠()线程?,c++,multithreading,C++,Multithreading,我正在创建一个将应用程序休眠1000毫秒的代码,我希望在左键单击鼠标按钮时完成休眠线程。我现在已经开始工作了,但我希望能够让睡眠线程只发生一次,然后在按下键后停止睡眠。 只有当我停止单击,然后再次单击时,它才会返回睡眠线程。您可以通过等待条件变量,然后在单击鼠标按钮时发出该条件变量的信号,提前结束睡眠 下面是一些概念验证代码,它应该向您展示如何做到这一点: #include <chrono> #include <thread> #include <condition
只有当我停止单击,然后再次单击时,它才会返回睡眠线程。您可以通过等待条件变量,然后在单击鼠标按钮时发出该条件变量的信号,提前结束睡眠 下面是一些概念验证代码,它应该向您展示如何做到这一点:
#include <chrono>
#include <thread>
#include <condition_variable>
#include <mutex>
#include <iostream>
using namespace std::chrono_literals;
std::chrono::time_point <std::chrono::steady_clock> start_time;
std::condition_variable cv;
std::mutex cv_m;
void demo_thread ()
{
std::cout << "demo thread waiting...\n";
std::unique_lock <std::mutex> lk (cv_m);
cv.wait_for (lk, 1000ms);
auto delta_t = std::chrono::steady_clock::now () - start_time;
std::cout << "demo thread terminating, delta_t = " << std::chrono::duration_cast<std::chrono::milliseconds> (delta_t).count() << "ms\n";
}
int main ()
{
start_time = std::chrono::steady_clock::now ();
auto t = std::thread (demo_thread);
std::cout << "main thread waiting...\n";
std::this_thread::sleep_for (200ms);
std::cout << "signal condition variable...\n";
{
std::unique_lock <std::mutex> lk (cv_m);
cv.notify_one ();
}
t.join ();
std::cout << "main thread terminating\n";
}
你一般不能那样做。然而,你可以在循环中睡得更短。可能是250毫秒,然后打破这个循环。不过,这取决于您使用的API。标准C++没有鼠标的概念。为了获得更准确的建议,你需要标记你正在使用的api或框架。命令线程睡眠是最被误用的,因为miss理解了时间安排。您所使用的回调函数类似于计时器和单击事件的处理程序。类似于boost::asio和Qt。也发布您的代码。如果您的应用程序处理鼠标点击,那么它可能基于GUI框架。在这种情况下,一秒钟都不要让应用程序处于睡眠状态。启动一秒钟的定时器,将应用程序置于不同的、类似睡眠的状态——无论对用户意味着什么,它都会呈现出睡眠的状态;但在此期间,它仍然可以对事件作出反应。然后,编写处理程序,在计时器启动或用户单击鼠标时(以先到者为准),将应用程序恢复到正常状态。
main thread waiting...
demo thread waiting...
signal condition variable...
demo thread terminating, delta_t = 200ms
main thread terminating