Qt多线程moveToThread

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

发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ly1390811049/article/details/103733564