我正在尝试跨线程发送信号。
为了测试这种情况,我写了一个测试代码。 我正在使用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;。我找不到问题。
你可以帮我解决这个问题吗? 感谢。答案 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;消息。