QObject: Cannot create children for a parent that is in a different thread
故障程序
#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QThread *parent) : QThread(parent)
{
ce = new CommandExecutor("ls /");
connect(ce, SIGNAL(finishedEvent()), this, SLOT(onFinished()));
}
void MyThread::run()
{
qDebug() << "start thread";
ce->start();
qDebug() << "exec";
exec();
qDebug() << "exec finished";
}
void MyThread::onFinished()
{
qDebug() << "onFinished";
if(ce){
ce->deleteLater();
}
}
运行时报错
2021-08-10 15:11:50:331[7f2dc67aa700]WARN: QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x13466a0), parent's thread is QThread(0x1304480), current thread is MyThread(0x1349cf0) ((null):0, (null))
注意,CommandExecutor是基于QProcess封装的命令执行器,改为在run()方法中初始化CommandExecutor实例,使得新实例归属当前线程。
新代码
#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QThread *parent) : QThread(parent)
{
}
void MyThread::run()
{
qDebug() << "start thread";
ce = new CommandExecutor("ls /");
connect(ce, SIGNAL(finishedEvent()), this, SLOT(onFinished()));
ce->start();
qDebug() << "exec";
exec();
qDebug() << "exec finished";
}
void MyThread::onFinished()
{
qDebug() << "onFinished";
if(ce){
ce->deleteLater();
}
}
运行结果
15:18:09: Starting /home/yeqiang/code/build-qt-training-Desktop-Debug/qt-training ...
2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: start thread (../qt-training/mythread.cpp:16, virtual void MyThread::run())
2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: "ls /" (../qt-training/commandexecutor.cpp:6, CommandExecutor::CommandExecutor(QString, QObject*))
2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: "ls /" started (../qt-training/commandexecutor.cpp:20, void CommandExecutor::start())
2021-08-10 15:18:09:900[7f8a1610d700]DEBUG: exec (../qt-training/mythread.cpp:20, virtual void MyThread::run())
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())
2021-08-10 15:18:09:901[7f8a1610d700]DEBUG: finished 0 (../qt-training/commandexecutor.cpp:44, void CommandExecutor::onFinished(int, QProcess::ExitStatus))
2021-08-10 15:18:09:901[7f8a1610d700]DEBUG: emit finishedEvent (../qt-training/commandexecutor.cpp:46, void CommandExecutor::onFinished(int, QProcess::ExitStatus))
2021-08-10 15:18:09:903[7f8a17dd6240]DEBUG: onFinished (../qt-training/mythread.cpp:27, void MyThread::onFinished())
注意在run()方法末尾调用exec();触发事件循环。
还没有评论,来说两句吧...