【问题标题】:In C++, how can I delay a part of a program while continuing with the overall program?在 C++ 中,如何在继续执行整个程序的同时延迟程序的一部分?
【发布时间】:2018-08-29 16:29:30
【问题描述】:

具体来说,我正在尝试将a = 1 + 1 延迟 10 秒。在此期间,我希望用户能够输入一个值。

如果用户没有及时响应,我会a = 1 + 1 变成a = 2,这会导致炸弹爆炸并杀死用户。

我尝试使用睡眠,但这会暂停整个程序并且不允许用户输入。如何让系统同时执行两个任务,在 10 秒内用户可以更改以禁用炸弹并使其不熄灭?

【问题讨论】:

  • 你需要一个事件循环。你不能让主线程休眠并期望事情仍然发生。
  • 1) 请附上您正在使用的代码 (minimal reproducible example)。 2)如果你不使用线程,这可能是不可能的。
  • 我没有代码,只是希望得到一个我应该阅读更多的方向。不过谢谢你,我要研究线程。

标签: c++ function loops sleep


【解决方案1】:

如何让系统同时执行这两项任务?

答案是并发。

例如 2 个线程,一个用于第一个任务,另一个用于第二个任务。以及它们之间的同步雨滴。

为了进一步阅读,我想推荐 Anthony Williams 的 C++ Concurrency in Action: Practical Multithreading。

【讨论】:

  • 没有理由用线程使程序复杂化来实现这一点。您只需要一个计时器和一个事件循环和/或一个状态机。
  • 它是众多实现之一,使用并发是否有任何限制或会伤害 OP?看完这个问题,我首先想到的肯定是并发。
  • 正确使用线程是困难 - 比编写正确的单线程程序要困难得多。当心线程——它们最终以难以重现和调试的方式咬住你(通常在最不方便的时间和你最大的客户身上)。线程有个用例,它们可以正确使用,只是要小心,不要将它们作为第一个解决方案,除非你真的必须这样做;是我的建议。
  • @JesperJuhl,没有人说这会很容易=)尤其是调试死锁或并发的其他婚外情。但这是一种体验,而且是积极的。
【解决方案2】:

您不需要使用睡眠,也不必强制使用多线程来完成任务。

最简单的解决方案是使用“消息循环”和刻度/时间控制函数(即 GetTickCount、QueryPerformance、timeGetTime)。

对于不那么复杂的任务来说,并发有点过头了。

【讨论】:

    【解决方案3】:

    这个问题的答案取决于具体情况。

    如果您通过阻塞当前线程的方法获取输入,例如std::cin,那么可能需要一个线程。

    但是,如果您通过不阻塞的方式获取输入,那么测量时间间隔将是一个有效的解决方案,因为您可以在达到时间限制后立即退出。对于这种情况,您可以通过std::chrono 测量时间。

    #include <iostream>
    #include <string>
    #include <chrono>
    
    int main()
    {
        using clock = std::chrono::steady_clock;
        auto start = clock::now();
        while (std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - start).count() < 2000) {
    
        }
        std::cout << "Took two seconds to complete.";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 2018-10-29
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多