【问题标题】:Signals not working anymore after QObjects being moved into QThreads将 QObjects 移入 QThreads 后,信号不再起作用
【发布时间】:2018-09-16 04:49:41
【问题描述】:

基本上,标题...如果没有 QThread(或者只是评论)我得到以下结果:

LOG> Log working!
LOG> PRODUCER: sent resource address: 29980624
PRODUCER: sent resource address: 29980624
CONSUMER: received resource address: 29980624

29980624,或任何相关的内存位置。

但是,当未注释时

LOG> Log working!

主窗口.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void slot_log(QString str);

signals:
    void signal_log(QString str);

private:
    void createConsumer( void );
    void deleteConsumer( void );
    void createProducer( void );
    void deleteProducer( void );
    void createConnections( void );
    SingleConsumer *consumer;
    QThread *thread_consumer;
    SingleProducer *producer;
    QThread *thread_producer;
};

主窗口.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    createConsumer();
    createProducer();
    createConnections();
    QTimer::singleShot(1000, producer, SLOT(slot_publishResourceAddress()) );
}

void MainWindow::slot_log(QString str)
{
    qWarning( QString("LOG> %1").arg(str).toUtf8() );
}

void MainWindow::createConnections( void )
{
    connect(this, SIGNAL(signal_log(QString)), this, SLOT(slot_log(QString)));
    emit signal_log(QString("Log working!"));

    connect(producer, SIGNAL(signal_resourceAddress(uint_fast8_t*)), consumer, SLOT(slot_resource(uint_fast8_t*)));
}

void MainWindow::createProducer( void )
{
     producer = new SingleProducer();
     thread_producer = new QThread();
     producer->moveToThread(thread_producer); // THIS LINE DESERVES ATTENTION
     connect(producer, SIGNAL(signal_log(QString)), this, SLOT(slot_log(QString)));
}

singleproducer.h

#ifndef SINGLEPRODUCER_H
#define SINGLEPRODUCER_H

#include <QWidget>

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

signals:
    void signal_resourceAddress( uint_fast8_t* addr );
    void signal_log(QString str);
public slots:

    void slot_publishResourceAddress( void )
    {
        emit signal_log( QString("PRODUCER: sent resource address: %1").arg((long int) &un_resources__) );
        qWarning(QString("PRODUCER: sent resource address: %1").arg((long int) &un_resources__).toUtf8());
        emit signal_resourceAddress( &un_resources__ );
    }


private:
    uint_fast8_t un_resources__;
};

#endif // SINGLEPRODUCER_H

编辑器不允许我发布更多代码...但我认为这是最相关的部分...如果不是,请告诉我。但我在pastebin分享了它

我的错误在哪里?

【问题讨论】:

    标签: c++ qt qthread


    【解决方案1】:

    MainWindow::createProducerMainWindow::createConsumer 中创建QThreads 后,您忘记了实际启动它们。来自documentation of the constructor of QThread

    构造一个新的QThread 来管理一个新线程。父级拥有 QThread 的所有权。 在调用 start() 之前线程不会开始执行

    所以你需要做的就是在创建线程后分别调用thread_producer-&gt;start()thread_consumer-&gt;start()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2021-04-21
      • 2022-01-22
      • 2017-12-15
      • 2015-01-22
      相关资源
      最近更新 更多