Qt 线程使用的疑惑

背身沙鹰瞄边选手 背身沙鹰瞄边选手 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
目前学习Qt涉及到QThread的使用,创建新线程后如何在新线程中调用,有些不清楚。希望有大佬能帮忙解释下。

代码:Worker类创建一个worker对象,将worker对象移动到新线程中,随后调动worker的方法。
Worker代码
Work.h
#ifndef WORK_H
#define WORK_H

#include <QObject>

class Work : public QObject
{
Q_OBJECT
public:
explicit Work(QObject *parent = nullptr);

public slots:
void do_work(const QString& parameter);

signals:
void result_ready(const QString& result);

};

#endif // WORK_H


Worker.cpp
#include <QThread>
#include <QtDebug>
#include "work.h"

Work::Work(QObject *parent) : QObject(parent)
{

}

void Work::do_work(const QString ¶meter)
{
qDebug()<< parameter << "start";
qDebug()<< (quint64) QThread::currentThreadId() << endl;
qDebug()<< parameter << "end";
}


具体调用代码:
void Thread_test::create_new_thread()
{
Work* work(new Work());
work->do_work("test");
qDebug()<< "------------------------------------------------" << endl;

// 创建新线程thread,将worker对象移动到thread
QThread* thread(new QThread());
work->moveToThread(thread);


connect(this, &Thread_test::singal_thread, work, &Work::do_work);

thread->start();
// 001
emit singal_thread("emit signal/slot");

// 002
work->do_work("calls do_work");
qDebug()<<"=============================================" << endl;

QThread::sleep(3);
qDebug()<< "in create_new_thread function" << (quint64) currentThreadId() << endl;
qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`" << endl;
}


001处通过信号槽调用do_work方法,打印的线程id与主线程不同。
002处直接调用do_work方法,打印的线程id与主线程始终一致。

只有通过信号槽才能真正的在新线程中运行么?
...全文
评论 2
收藏 已收藏
分享
返回顶部
背身沙鹰瞄边选手
Qt 21,503 成员 26,693 内容