Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C++如何停止睡眠()线程?_C++_Multithreading - Fatal编程技术网

用C++如何停止睡眠()线程?

用C++如何停止睡眠()线程?,c++,multithreading,C++,Multithreading,我正在创建一个将应用程序休眠1000毫秒的代码,我希望在左键单击鼠标按钮时完成休眠线程。我现在已经开始工作了,但我希望能够让睡眠线程只发生一次,然后在按下键后停止睡眠。 只有当我停止单击,然后再次单击时,它才会返回睡眠线程。您可以通过等待条件变量,然后在单击鼠标按钮时发出该条件变量的信号,提前结束睡眠 下面是一些概念验证代码,它应该向您展示如何做到这一点: #include <chrono> #include <thread> #include <condition

我正在创建一个将应用程序休眠1000毫秒的代码,我希望在左键单击鼠标按钮时完成休眠线程。我现在已经开始工作了,但我希望能够让睡眠线程只发生一次,然后在按下键后停止睡眠。
只有当我停止单击,然后再次单击时,它才会返回睡眠线程。

您可以通过等待条件变量,然后在单击鼠标按钮时发出该条件变量的信号,提前结束睡眠

下面是一些概念验证代码,它应该向您展示如何做到这一点:

#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