一、注意事项:

  • 线程处理类继承于 QObject
  • 线程处理类对象不能有父对象
  • 处理完成后向外发信号
  • 即使 QThread 线程内部的处理对象运行结束了,QThread 线程对象也不会自动释放,需要手动 quit() + wait()
  • 线程处理类对象创建成功后,需要通过 moveToThread() 函数移动到 QThread 对象中
  • 需要通过其他线程发信号来启动另外线程中的处理类对象的处理函数
  • 子线程中不要操作图形界面

二、connect 第五个参数的作用

指定信号和槽的连接方式:自动连接直接连接队列连接,多线程时才有意义,默认为 Qt::AutoConnection

  • Qt::AutoConnection(自动连接):多线程时是 Qt::QueuedConnection(队列连接),单线程时是 Qt::DirectConnection(直接连接)
  • Qt::QueuedConnection(队列连接):槽函数所在线程和信号接收者所在线程相同
  • Qt::DirectConnection(直接连接):槽函数所在线程和信号发送者所在线程相同

三、代码示例

  1. 线程处理类

    class MyThreadPro : public QObject
    {
        Q_OBJECT
    public:
        explicit MyThreadPro(QObject *parent = nullptr);
        // 后台处理函数
        void startProcessing();
        // 是否结束标识位
        void setFlag(bool b = false);
    
    signals:
        // 向其他线程发送信号
        void myTimeout();
    
    private:
        bool stopRunning;
    };
    
  2. 主窗口类

    ThreadProWidget::ThreadProWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ThreadProWidget)
    {
        ui->setupUi(this);
    
        // 新建子线程处理对象,不能指定父对象
        myThread = new MyThreadPro();
    
        // 创建子线程
        thread = new QThread(this);
    
        // 将处理类对象移动到子线程中
        myThread->moveToThread(thread);
    
        // 绑定子线程处理结束信号
        connect(myThread, &MyThreadPro::myTimeout, this, &ThreadProWidget::on_myTimeout);
    
        // 通过主线程发送信号启动子线程中的处理函数
        connect(this, &ThreadProWidget::startMyThread, myThread, &MyThreadPro::startProcessing);
    
        qDebug() << "主线程:" << QThread::currentThread();
    }