涉及QThreadPool的跨线程信号槽不起作用

时间:2019-12-17 04:11:22

标签: c++ qt c++11 c++14

我写了一个小程序,目的是在QThreadPool启动的线程上运行QRunnable的子类,以信号通知在主线程上运行的QObject的子类。信号已发送,但是以某种方式未触发插槽功能?

//main.hpp
#ifndef MAIN_HPP
#define MAIN_HPP

#include <QObject>
#include <QRunnable>
#include <QThreadPool>
#include <iostream>

class SIG : public QObject, public QRunnable
{
  Q_OBJECT

  signals:
    void my_signal();

  public:
    SIG() = default;
    virtual ~SIG(){};

    void run()
    {
      std::cout << "running!" << std::endl;
      emit my_signal();
    };
};

class SLO: public QObject
{
  Q_OBJECT

  public:
      SLO() = default;
      virtual ~SLO(){};
    public slots:
      void my_slot()
        {
          std::cout << "signal received!" << std::endl;
        };
};

#endif // MAIN_HPP

//main.cpp
#include "main.hpp"

int main(int argc, char *argv[])
{
    QThreadPool *pool = QThreadPool::globalInstance();
    SIG *sig = new SIG();
    SLO *slo = new SLO();
    QObject::connect( sig, &SIG::my_signal,
                      slo, &SLO::my_slot );
    pool->start( sig );
}

程序输出如下:

  

开始   / home / work / build-exp_thread_sig_slot-Desktop_Qt_5_10_0_GCC_64bit-Debug / exp ...

     

运行中!

     

/ home / work / build-exp_thread_sig_slot-Desktop_Qt_5_10_0_GCC_64bit-Debug / exp   退出,代码为0

为什么不触发SLO :: my_slot函数?

0 个答案:

没有答案