Qt,如何立即暂停QThread

标签 qt qthread

我有一个监听服务器的QThread。我想立即暂停 QThread 的工作。根本不需要等待,但几乎就像终止一样,它必须是立即的。

最佳答案

在任何给定线程中运行的代码都不能在任意点停止,而不破坏代码和/或 C/C++ 运行时或使用的任何其他库中共享数据结构的状态。

代码只能在明确定义的点处停止。

如果您的线程运行事件循环(即通常如果您不是从 QThread 派生或不重写其 run),则 QThread: :quit() 一旦线程将控制权返回到事件循环,就会停止线程,这样做是安全的。

如果您的线程重新实现 run 并在那里执行循环,则它应该在请求中断时返回:

void MyThread::run() {
  while (! isInterruptionRequested()) {
    ...
  }
}

这样的线程可以通过QThread::requestInterruption()停止。

作为引用,以下是QThread的各种有时令人困惑的方法:

  • wait() 阻塞调用线程,直到被调用线程完成。当然,从线程本身内部调用它会立即死锁:如果线程等待永远不会发生的事情,则它无法完成。

  • quit() 尽早退出线程的事件循环,并导致 QThread::run() 返回。如果您重新实现 run() 并且不旋转事件循环,它不会执行任何操作。

  • requestTermination() 设置一个标志,YourThread::run() 中的自定义循环可以通过 isTerminationRequested() 检查该标志.

  • terminate()立即停止线程。这通常会破坏应用程序的状态,因此您必须尽快abort(),否则将面临后果。最好忘记这种方法。它本质上意味着“如果有机会的话,尽快让这个进程崩溃并损坏一些磁盘数据”。

关于Qt,如何立即暂停QThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232182/

相关文章:

python - 暂停和恢复 QThread

c++ - 如何在具有 OpenMP 功能的 QThread 中强制使用多核

c++ - C++的简单多线程混淆

c++ - 为什么Qt默认信号是公开的?

c++ - Qt 的事件循环线程是安全的还是原子的?处理 `QueuedConnection` 时如何同步?

c++ - 如何从 QGraphicsView 保存图像?

c++ - 从另一个线程打破循环

qt - 需要一个没有 QML 的 Qt 的 GridView

QTableView : change precision for double values

c++ - QThread::create 在 UI 线程上运行