2016-08-30 49 views
1

我有一个QThread听服务器。我想立即暂停QThread的工作。根本没有等待,但几乎像是终止,它必须是立竿见影的。Qt,如何暂停QThread

+2

你能提供一些代码吗?现在还不清楚你的意思。如你所见,msleep方法立即暂停线程的工作。这是你想要的吗? –

+1

_“它必须像刀一样切割”_O_o –

+0

QThread的运行功能发出信号。我想终止由信号发出的东西alrealdy作品。 –

回答

11

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

该代码只能停在明确定义的点上。

如果你的线程中运行一个事件循环(即通常,如果你不从QThread得到或没有覆盖其run),然后将QThread::quit()一旦控制权返回给事件循环,它是安全的停止线程这样做。

如果你的线程运行重新实现有执行一个循环,它应该被要求中断时返回:

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

这样的线程是QThread::requestInterruption()停止的。

仅供参考,这里是有时迷茫的QThread各种方法:

  • wait()块调用线程,直到被调用线程结束。当然,从线程本身调用它会立即造成死锁:如果一个线程等待一些永远不会发生的事情,线程就无法完成。

  • quit()尽早退出线程的事件循环,并导致返回QThread::run()。如果你重新实现了run()并且不旋转事件循环,它什么也不做。

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

  • terminate()停止线程现在。这通常会破坏您的应用程序的状态,因此您必须很快或不久就要面临后果。这种方法最好被遗忘。这实际上意味着“如果你有机会,很快就会崩溃这个过程并损坏一些磁盘数据”。