我正在创建一个使应用程序进入1000 MS睡眠状态的代码,我希望在鼠标左键单击时完成sleep()线程。我现在可以正常工作了,但是我希望能够使sleep线程只发生一次,然后在按下键后它会停止sleep()。 一旦我停止单击然后再次单击,它只会返回睡眠线程。
答案 0 :(得分:0)
您可以通过等待条件变量,然后在单击鼠标按钮时发信号通知该条件变量来提前结束睡眠。
以下是一些概念验证代码,应向您展示如何做:
#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";
}
输出:
main thread waiting...
demo thread waiting...
signal condition variable...
demo thread terminating, delta_t = 200ms
main thread terminating