2. moveToThread
这种方式依赖,子线程的QThread::exec() 子程序的消息循环中收到信号,执行对应的槽函数
消息循环在程序结束时如果没退出,qt会帮你退出
注意:pMyWork->moveToThread(pThread); pMyWork不能有父对象
class CMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit CMainWindow(QWidget *parent = nullptr);
~CMainWindow();
private:
Ui::CMainWindow *ui;
signals:
void doMyWork();
};
CMainWindow::CMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CMainWindow)
{
ui->setupUi(this);
qDebug() << "main thread id: " << QThread::currentThreadId();
QThread* pThread = new QThread(); //有父对象时父对象释放,会释放该线程对象
//QThread 的run函数里面会执行(void) exec(); 夸线程响应槽函数依赖消息循环 消息循环一般不知道子线程什么时候会执行完毕 可以使用这种方式释放线程对象
//注意这里是主线程 主线程调用deleteLater()一般没有问题, 如果线程对象属于子线程要注意子线程是否还能响应该信号
connect(pThread, &QThread::finished, pThread, &QThread::deleteLater);
CMyWork* pMyWork = new CMyWork();
//注意这里 pMyWork不能有父对象
pMyWork->moveToThread(pThread);
//触发信号后,在子线程中执行TestWork 依赖QThread::exec() 收到信号后执行
connect(this, &CMainWindow::doMyWork, pMyWork, &CMyWork::TestWork);
pThread->start();
//触发信号
emit doMyWork();
}
CMainWindow::~CMainWindow()
{
delete ui;
}
class CMyWork : public QObject
{
Q_OBJECT
public:
explicit CMyWork(QObject *parent = nullptr);
void TestWork();
signals:
public slots:
};
CMyWork::CMyWork(QObject *parent) : QObject(parent)
{
}
void CMyWork::TestWork()
{
qDebug() << "myThread testWork ThreadId" << QThread::currentThreadId();
}
输出:
main thread id: 0x43a0
myThread testWork ThreadId 0x43c0