【问题标题】:Using C++ how can I stop a sleep() thread? [closed]使用 C++ 如何停止 sleep() 线程? [关闭]
【发布时间】:2019-04-21 14:07:02
【问题描述】:

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

【问题讨论】:

  • 您通常不能这样做。但是,您可以在循环中睡更短的时间。可能需要 250 毫秒,然后跳出那个循环。但是,这取决于您使用的 API。标准c++ 没有鼠标的概念。您需要标记您正在使用的 api 或框架以获得更准确的建议。
  • 命令线程休眠是最被滥用的,因为miss理解时间的东西。你的回调就像计时器和点击事件的处理程序。就像 boost::asio 和 Qt 一样。
  • 同时发布您的代码。
  • 如果您的应用程序处理鼠标点击,那么它可能基于 GUI 框架。在这种情况下,不要“让应用程序休眠一秒钟”。启动一秒计时器,并将应用程序置于不同的“睡眠状”状态——在这种状态下,它向用户;但在此期间它仍然可以响应事件。然后,编写处理程序,在计时器触发或用户单击鼠标时(以先到者为准)将应用程序恢复到“正常状态”。

标签: c++ multithreading


【解决方案1】:

您可以通过等待条件变量并在单击鼠标按钮时向该条件变量发出信号来提前结束睡眠。

这里有一些概念验证代码,应该会告诉你如何做到这一点:

#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多