如何在C++中挂起程序,然后"取消挂起"它



将C++程序挂起一定时间的最佳方法是什么?

鉴于程序在此期间无响应,是否可以控制程序何时恢复正常?

程序的"响应性"对我来说听起来是特定于操作系统的,而不是C++......例如,在 MS 窗口中,程序应该处理窗口事件,如果它停止读取事件队列,窗口将在一段时间后声称它"没有响应"......虽然该应用程序仍然可以在其代码中做很多事情,即进行一些计算或修改文件或通过网络进行通信,即远非"无响应"。但是为了在操作系统上很好地玩它,大多数应用程序会定期窥视队列,让窗口知道它们是"活着的"并响应操作系统事件(其中还包括键下/向上事件、窗口大小调整/移动、窗口内容重绘请求等 = 许多你真正想以任何方式在 GUI 应用程序中定期做的事情(。

所以问题是,如果你想让你的应用程序以操作系统的方式"无响应"(并继续在后台做事(=然后停止处理操作系统特定的调用/事件,并在计算你自己的东西时"玩死",或者你想暂停它的正常操作并"什么都不做",直到恢复。

(编辑:现代操作系统正在使用抢占式多任务处理,为每个正在运行的进程提供一些 CPU 时间,每隔几微/毫秒在它们之间切换一次,以产生进程"同时"运行的错觉,所以如果你不使用类似sleep的解决方案,只是运行一些循环等待外部信号,如解锁文件或网络数据包, 您将白白消耗大量CPU时间,这些时间本可以被其他应用程序使用(

如果要暂停应用程序,花费空闲时间的最佳方法是使用sleep函数,该功能将使用最少的系统资源将CPU时间返回给操作系统。您仍然可以在与 1-3 秒睡眠交错的循环中处理操作系统事件,因此操作系统会将您的应用视为"响应",您甚至可以让 UI 暂停/恢复,但您的应用将使用可以忽略不计的 CPU 时间。

如何向应用发出暂停/恢复事件的信号取决于要用于控制它的内容。您可以使用特定于平台的 IPC(进程间通信(或网络数据包、UI 按钮、文件系统事件(锁定/解锁特定共享文件以提供进程间同步或数据传递(或操作系统事件(如在 android 上,您可以侦听操作系统事件,如用户锁定/解锁显示等(。

这些都不是(除了sleep函数(标准化的C++,以至于我可以给出更详细的答案,而且由于您没有指定有关编译器和目标操作系统的任何内容,因此我编写了这个通用的闲聊答案。

您可以使用标准的C++线程库。 std::this_thread::sleep_for(( 将允许您在规定的时间内睡眠。这将允许您在具有相同代码的任何平台上实现目标。

#include <chrono>
#include <thread>
#include <iostream>
int main()
{
using namespace std::chrono_literals;
while(true)
{
std::cout << "tickn";
std::this_thread::sleep_for( 500ms );
}
return 0;
}

您可以在此处运行代码:https://onlinegdb.com/HkqZkpmUB

时间库允许您使用这些 https://en.cppreference.com/w/cpp/language/user_literal 使用一些预定义的"用户定义的文字"。若要使用用户定义的文本,必须在命名空间范围内。这就是这条线的作用,它允许我使用 500ms:

using namespace std::chrono_literals;

sleep_for函数使调用它的线程休眠定义的时间量。如果该线程是 GUI 或控制台线程,则它将无响应。

相关内容

最新更新