使用C ++如何停止sleep()线程?

时间:2019-04-21 14:07:02

标签: c++ multithreading

我正在创建一个使应用程序进入1000 MS睡眠状态的代码,我希望在鼠标左键单击时完成sleep()线程。我现在可以正常工作了,但是我希望能够使sleep线程只发生一次,然后在按下键后它会停止sleep()。 一旦我停止单击然后再次单击,它只会返回睡眠线程。

1 个答案:

答案 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

Live demo