c++ - 关于在我的应用程序中实现 QThread 的问题?

标签 c++ qt mingw qthread

this question 中的建议,我现在正在尝试合并多线程。

根据 the links given by karlphillip ,我知道关于子类化 QThread 的文档不被遵循和使用 moveToThread()正如所解释的。现在我看到 QThread 的默认实现 run()只有一个 exec()然后必须通过调用 quit() 结束当工作线程完成操作时。我现在有几个问题,以便我更好地理解事情:

QApplication* ptrApp=new QApplication(argc,argv);
QThread* th=new QThread;
MyClass* obj=new MyClass;
obj->moveToThread(th);
QObject::connect(th,SIGNAL(started()),obj,SLOT(someFunct()));
QObject::connect(obj,SIGNAL(over()),th,SLOT(quit()));
th->start();
//some GUI code in main thread here
return ptrApp->exec();
  1. 如果我继续使用会怎样 someFunct()即使在我发出 over() 之后来自内部someFunct() ?是未定义的行为还是正常的?

  2. 哪个线程会 obj现在关联(而发出 over() 后的其余代码仍在 someFunct 中执行)?我的理解是:不能在th当我有 quit()那个线程... quit()将排队直到 exec()在主线程中执行它会导致 exec()run()th退出(我希望我在这里没有犯错)。我假设该线程不再存在。

  3. 一次插槽quit()对于 th被执行,是否可以安全地假设线程确实已经退出或者我应该进一步连接 finished() th的信号到某个插槽以绝对确定?

最佳答案

  1. 事件循环是否终止并不重要,somefunct() 将继续运行,直到它把控制权交还给现已结束的循环。

  2. obj 与线程保持关联,因此如果发出连接到其插槽之一的信号,则插槽将不会运行,但它将排队等候/如果线程重新启动。
    如果QThread对象被删除,obj->thread()返回0,所以我想这相当于调用obj->moveToThread (0) 并根据文档:

    If targetThread is zero, all event processing for this object and its children stops.

  3. quit() 终止事件循环,然后 finished() 信号从线程发出,线程终止。
    因此,即使您收到finished() 信号,您也不应该假设线程已经完成。您可以在主线程中使用 QThread::wait,在收到该信号后确保这一点。
    如果线程处于完成状态,QThread析构函数已经调用了wait,所以您可以在finished()<之后安全地删除线程 信号(使用 deleteLater() 更安全)。

关于c++ - 关于在我的应用程序中实现 QThread 的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728017/

相关文章:

c++ - Pthread 模板参数错误

C++ Boost - 没有找到接受类型为 'boost::filesystem::path' 的右手操作数的运算符

c++ - 尝试使用 Qt 库中的 QPixmap 将图像分成几个 block 。他的复制方法的工作方式有什么我不明白的吗?

qt - 杀死停止并恢复的 QProcess

c - 如何使用 MinGW 在命令行上编译 C 程序?

c++ - GCC 模板问题

c++ - 如何在不继承句柄的情况下 fork 进程?

c++ - 尝试运行应用程序时缺少 Qt5Cored.dll

c - GCC:建议在无法解决我自己问题的比较括号周围加上括号

c - 将 MinGW 程序与 MSVC 静态库链接时发出警告