线程未送达的QT信号

时间:2017-03-06 22:41:09

标签: c++ multithreading qt qthread

首先,我花了相当多的时间研究这个主题,并尝试了许多不同的配置无济于事。看来下面的内容接近于预期的内容,但我仍然缺少一些东西。

我从这个错误开始,同样怀疑程序是否按顺序执行,尽管我试图将其线程化......

QObject::moveToThread: Cannot move objects with a parent

此外,程序中任何地方(或线程尝试)的qDebug() << QThread::currentThreadId();都返回相同的ID

然后我从此

更改了我的mainwindowTop_Calc构造函数
    SDS::SDS(QWidget *parent) : 
        QMainWindow(parent), 
        ui(new Ui::SDS),
        Top_Calc(this)
   {

到这个

   SDS::SDS(QWidget *parent) : 
        QMainWindow(parent), 
        ui(new Ui::SDS)
   {

现在,错误消失了,但是我的来自主窗口的信号似乎没有到达相应的线程,尽管.isrunning()返回true

MainWindow.cpp

    SDS::SDS(QWidget *parent) : 
        QMainWindow(parent), 
        ui(new Ui::SDS)
   {
    ui->setupUi(this);
    qRegisterMetaType< Settings >();
    connect(this, SIGNAL(SendTopHandles(Settings&)), &Top_Calc, SLOT(ReceiveHandles(Settings&)));

    Top_Calc.moveToThread(&TopThread);
    TopThread.start();
    }

    int SDS::on_StartScan_clicked() {
        emit SendTopHandles(RunSet);
    }

MainWindow.h

    class SDS : public QMainWindow
    {
         Q_OBJECT

    public:
         explicit SDS(QWidget *parent = 0);
    protected: 
         Settings RunSet;
    private:
        Ui::SDS *ui;
        QThread TopThread;
        TopCalc Top_Calc;
    signals:
        void SendTopHandles(Settings& RunSet);
    }

CalcThreads.h

     class TopCalc : public QObject
     {
        Q_OBJECT
     public:
        explicit TopCalc(QObject *parent = 0);

     protected:
        Settings* RunSet;
     public slots:
        void ReceiveHandles(Settings& RunSet);
     }

CalcThreads.cpp

TopCalc::TopCalc(QObject *parent) :
QObject(parent)
{
}

void TopCalc::ReceiveHandles(Settings& S) {
    RunSet = &S;
}

程序永远不会进入ReceiveHandles函数。它继续在以后的命令。如果我从构造函数和头文件中删除QObject父,我得到相同的结果。

我是否应该将线程变量放在main()函数中而不是ui构造函数中,因为有很多例子显示?

我错过了什么?

0 个答案:

没有答案