QObject: Cannot create children for a parent that is in a different thread

女爷i 2022-09-04 02:53 27阅读 0赞

故障程序

  1. #include "mythread.h"
  2. #include <QDebug>
  3. MyThread::MyThread(QThread *parent) : QThread(parent)
  4. {
  5. ce = new CommandExecutor("ls /");
  6. connect(ce, SIGNAL(finishedEvent()), this, SLOT(onFinished()));
  7. }
  8. void MyThread::run()
  9. {
  10. qDebug() << "start thread";
  11. ce->start();
  12. qDebug() << "exec";
  13. exec();
  14. qDebug() << "exec finished";
  15. }
  16. void MyThread::onFinished()
  17. {
  18. qDebug() << "onFinished";
  19. if(ce){
  20. ce->deleteLater();
  21. }
  22. }

运行时报错

  1. 2021-08-10 15:11:50:331[7f2dc67aa700]WARN: QObject: Cannot create children for a parent that is in a different thread.
  2. (Parent is QProcess(0x13466a0), parent's thread is QThread(0x1304480), current thread is MyThread(0x1349cf0) ((null):0, (null))

注意,CommandExecutor是基于QProcess封装的命令执行器,改为在run()方法中初始化CommandExecutor实例,使得新实例归属当前线程。

新代码

  1. #include "mythread.h"
  2. #include <QDebug>
  3. MyThread::MyThread(QThread *parent) : QThread(parent)
  4. {
  5. }
  6. void MyThread::run()
  7. {
  8. qDebug() << "start thread";
  9. ce = new CommandExecutor("ls /");
  10. connect(ce, SIGNAL(finishedEvent()), this, SLOT(onFinished()));
  11. ce->start();
  12. qDebug() << "exec";
  13. exec();
  14. qDebug() << "exec finished";
  15. }
  16. void MyThread::onFinished()
  17. {
  18. qDebug() << "onFinished";
  19. if(ce){
  20. ce->deleteLater();
  21. }
  22. }

运行结果

  1. 15:18:09: Starting /home/yeqiang/code/build-qt-training-Desktop-Debug/qt-training ...
  2. 2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: start thread (../qt-training/mythread.cpp:16, virtual void MyThread::run())
  3. 2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: "ls /" (../qt-training/commandexecutor.cpp:6, CommandExecutor::CommandExecutor(QString, QObject*))
  4. 2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: "ls /" started (../qt-training/commandexecutor.cpp:20, void CommandExecutor::start())
  5. 2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: exec (../qt-training/mythread.cpp:20, virtual void MyThread::run())
  6. 2021-08-10 15:18:09:901[7f8a1610d700]DEBUG: "stdout: bin\nboot\nDesktop\ndev\netc\nhome\nlib\nlib32\nlib64\nlibx32\nlost+found\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsnap\nsrv\nsys\nTemplates\ntmp\nusr\nvar\nVirtualBox VMs\n" (../qt-training/commandexecutor.cpp:31, void CommandExecutor::onReadStandardOutput())
  7. 2021-08-10 15:18:09:901[7f8a1610d700]DEBUG: finished 0 (../qt-training/commandexecutor.cpp:44, void CommandExecutor::onFinished(int, QProcess::ExitStatus))
  8. 2021-08-10 15:18:09:901[7f8a1610d700]DEBUG: emit finishedEvent (../qt-training/commandexecutor.cpp:46, void CommandExecutor::onFinished(int, QProcess::ExitStatus))
  9. 2021-08-10 15:18:09:903[7f8a17dd6240]DEBUG: onFinished (../qt-training/mythread.cpp:27, void MyThread::onFinished())

注意在run()方法末尾调用exec();触发事件循环。

发表评论

表情:
评论列表 (有 0 条评论,27人围观)

还没有评论,来说两句吧...

相关阅读