Qt 4.8,如何从不同的线程发送信号?

时间:2018-02-21 16:19:30

标签: c++ qt qt4 signals-slots qt4.8

我正在尝试跨线程发送信号。

为了测试这种情况,我写了一个测试代码。 我正在使用ubuntu 16.04机器,qt版本是4.8。

在我的代码中,存在三个类:

1 - timer_class - >在这个类中,我在超时时隙中发出信号。

2 - test_worker - >我正在使用这个类作为线程的工作者。

3 - main_class - >我创建了timer_class实例,并在这个类构造函数中创建了线程。

我正在尝试将timer_class信号连接到test_worker插槽。

这是我的代码:

First; timer_class :

标题文件:

#ifndef TIMER_CLASS_H
#define TIMER_CLASS_H

#include <QTimer>
#include <QDebug>
#include <QObject>

class timer_class : public QObject
{
    Q_OBJECT
public:
    timer_class(QObject *parent = 0);
    ~timer_class();

    void start_timer();

signals:
    void dummy_signal();

private slots:
    void on_timeout_occur();

private:
    QTimer *timer;
};

#endif // TIMER_CLASS_H

源文件:

#include "timer_class.h"

timer_class::timer_class(QObject *parent)
    :QObject(parent)
{
    timer = new QTimer();
    connect(timer, SIGNAL(timeout()), this, SLOT(on_timeout_occur()));
}

timer_class::~timer_class()
{

}

void timer_class::start_timer()
{
    timer->start(1000);
}

void timer_class::on_timeout_occur()
{
    qDebug() << "timeout occur";
    emit dummy_signal();
}

二,thread_worker类: 头文件:

#ifndef THREAD_WORKER_H
#define THREAD_WORKER_H

#include <QDebug>
#include <QObject>

class thread_worker : public QObject
{
    Q_OBJECT
public:
    thread_worker(QObject *parent = 0);
    ~thread_worker();

public slots:
    void main_loop();
    void on_dummy_signal();
};

#endif // THREAD_WORKER_H

源文件:

#include "thread_worker.h"

thread_worker::thread_worker(QObject *parent)
    :QObject(parent)
{

}

thread_worker::~thread_worker()
{

}

void thread_worker::main_loop()
{
    forever
    {
        //qDebug() << "In Main Loop";
    }
}

void thread_worker::on_dummy_signal()
{
    qDebug() << "dummy signal received";
}

最后,main_class: 头文件:

#ifndef MAIN_CLASS_H
#define MAIN_CLASS_H

#include <QObject>
#include <QDebug>
#include <QThread>
#include "timer_class.h"
#include "thread_worker.h"

class main_class : public QObject
{
    Q_OBJECT
public:
    main_class(QObject *parent = 0);
    ~main_class();

private:
    QThread *thread;
    timer_class *tmr_class;
    thread_worker *worker;
};

#endif // MAIN_CLASS_H

源文件:

#include "main_class.h"

main_class::main_class(QObject *parent)
    :QObject(parent)
{
    tmr_class   = new timer_class();
    worker      = new thread_worker();
    thread      = new QThread();

    worker->moveToThread(thread);
    connect(tmr_class, SIGNAL(dummy_signal()), worker, SLOT(on_dummy_signal()));

    connect(thread, SIGNAL(started()), worker, SLOT(main_loop()));
    thread->start();
    tmr_class->start_timer();
}

main_class::~main_class()
{

}

在main.cpp中,我只需创建main_class实例:

#include <QCoreApplication>
#include "main_class.h"

    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);

        main_class *main_cl = new main_class();

        qDebug() << "executing a.exec";
        return a.exec();
    }

当我运行应用程序时,我看到&#34;超时发生&#34;在控制台,但我没有看到&#34;收到虚拟信号&#34;。我找不到问题。

你可以帮我解决这个问题吗? 感谢。

1 个答案:

答案 0 :(得分:0)

基本问题是您正在创建新的QThread,将timer_class实例移动到该线程上,然后在线程启动时调用thread_worker::main_loop。由于thread_worker::main_loop基本上是一个忙碌的等待循环......

void thread_worker::main_loop ()
{
  forever
  {
    //qDebug() << "In Main Loop";
  }
}

... QThread永远不会有机会处理事件,从而阻止通过排队连接接收任何信号。

所有这一切的正确解决方案在很大程度上取决于您希望thread_worker::main_loop做什么工作(如果有的话)。

为了让事情顺利进行,只需删除forever循环或注释掉该行......

connect(thread, SIGNAL(started()), worker, SLOT(main_loop()));

完成后,您应该看到&#34;接收的虚拟信号&#34;消息。