c++ - 在程序关闭期间终止 Qt 工作线程

标签 c++ multithreading qt synchronous application-shutdown

我使用 Qt 4.8.6、MS Visual Studio 2008、Windows 7。我创建了一个 GUI 程序。它包含主 GUI 线程和工作线程(顺便说一句,我没有制作 QThread 子类),它们同步调用第 3 方 DLL 函数。这些功能相当慢。 QTcpServer 实例也在工作线程下。我的 worker 类包含 QTcpServer 和 DLL 包装器方法。

我知道 quit() 优于 terminate(),但我不想在程序关闭期间等待一分钟(因为 DLL 函数速度慢) .当我尝试 terminate() 工作线程时,我注意到有关从另一个线程停止 QTcpServer 的警告。进程关闭的正确方法是什么?

最佳答案

QThread::quit 告诉线程的事件循环退出。调用它后,一旦控件返回到线程的事件循环,线程就会结束

您也可以通过 QThread::terminate() 强制线程立即终止,但这是一种非常糟糕的做法,因为它可能会在其代码中未定义的位置终止线程,这意味着您最终可能会得到永远无法释放的资源和其他令人讨厌的东西。所以只有当你真的无法绕过它时才使用它。

所以我认为正确的做法是首先告诉线程正常退出,如果出现问题并且花费了很多时间并且您没有办法等待它,那么就终止它:

QThread * th = myWorkerObject->thread();
th->quit();
th->wait(5000); // Wait for some seconds to quit

if(th->isRunning()) // Something took time more than usual, I have to terminate it
    th->terminate();

关于c++ - 在程序关闭期间终止 Qt 工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384705/

相关文章:

Java/Groovy 线程退出操作

java - 限制 JVM 使用的线程数

c++ - 在使用 Qt Creator 创建一个非常简单的项目时卡在 Qt 中的 "segmentation fault"

c++ - 此操作的顺序是否正确?

c++ - CritSec.h 不存在 (Win 8.1)

c# - 读/写锁定混淆

c++ - 使用 C++ 在不同选项卡中显示相同 QWidget 的 QTabWidget 或 QTabBar

c++ - 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

c++ - 我如何用 c 中的 switch 翻转我的语句?

windows - 在Inno Setup中将我的QT应用程序与视频/图像文件相关联