Qt 线程使用的疑惑
目前学习Qt涉及到QThread的使用,创建新线程后如何在新线程中调用,有些不清楚。希望有大佬能帮忙解释下。
代码:Worker类创建一个worker对象,将worker对象移动到新线程中,随后调动worker的方法。
Worker代码
Work.h
Worker.cpp
具体调用代码:
001处通过信号槽调用do_work方法,打印的线程id与主线程不同。
002处直接调用do_work方法,打印的线程id与主线程始终一致。
只有通过信号槽才能真正的在新线程中运行么?
代码: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_HWorker.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与主线程始终一致。
只有通过信号槽才能真正的在新线程中运行么?
...全文
相关推荐
Qt线程池+多线程使用
保证线程安全的Qt线程池使用,线程任务可以和其他线程通信,使用场景:频繁操作的I/O操作或是耗时操作。
QT多线程moveToThread使用方式
对QT中多线程的使用方式moveToThread方法进行剖析,通过新建两种不同的类分别实现moveToThread方法,并通过实例化对象验证该方法。
QT5线程QThread使用示例
本示例采用继承QThread的方式创建线程,在创建的子线程中计数,并将计数的数值通过信号与槽的方式发送至主线程,在主线程的UI界面上显示出来。
Qt 线程池(QThreadPool )的使用
Qt 使用线程池 构建 多线程 多任务 代码是自己写的小demo 可以直接运行
Qt 使用多线程QThread实现进度条
Qt 使用多线程QThread实现进度条


