【发布时间】:2013-01-27 15:41:49
【问题描述】:
我想知道在 MainWindow 的构造器中创建的两个 QObjects 之间连接信号/插槽的最佳做法是什么,但后来移动到不同的线程...当我使用选项 Qt::Directconnection 连接时,默认连接似乎不起作用事情开始工作了...但有时信号/插槽会失败...以下是我的代码模式..如果我需要更改我的类设计,请告诉我...
MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
{
myObjectA = new ObjectA;
myObjectB = new ObjectB;
connect( myObjectA,SIGNAL(signalA()),myObjectB,SLOT(slotB()) );
myObjectA.initiateProcess();
myObjectB.initiateProcess();
}
ObjectA.h
#include <QThread>
#include <QObject>
class ObjectA : public QObject
{
Q_OBJECT
public:
explicit ObbjectA(QObject *parent = 0);
void inititateProcess();
public slots:
void do_job();
signals:
void signalA();
private:
QThread *worker;
}
ObjectA.cpp
ObjectA::ObjectA(QObject* parent)
{
....
}
void ObjectA::do_jobA()
{
//do something;
}
void ObjectA::initiateProcess()
{
worker = new QThread;
connect(worker,SIGNAL(started()),this,SLOT(do_jobA()));
this->moveTo(worker);
worker->start()
}
ObjectB.h
#include <QThread>
#include <QObject>
class ObjectB : public QObject
{
Q_OBJECT
public:
explicit ObjectB(QObject *parent = 0);
void initiateProcess();
public slots:
void do_job();
void slotB();
signals:
void signalB();//for some other slot
private:
QThread *worker;
}
ObjectB.cpp
ObjectB::ObjectB(QObject* parent)
{
....
}
void ObjectB::do_jobB()
{
//do something;
}
void ObjectB::initiateProcess()
{
worker = new QThread;
connect(worker,SIGNAL(started()),this,SLOT(do_jobB()));
this->moveTo(worker);
worker->start()
}
【问题讨论】:
-
您的代码对我有用。随机猜测可能有什么问题:do_jobA 或 do_jobB 是否可能没有终止,因此线程没有机会执行其插槽?
-
好的...这是一个很好的猜测,因为在其中一个 do_job 我有一个等待 QWaitcondition 的 while 循环...但我需要那个 while 循环来使一个线程中的对象等待一些来自不同线程的数据...
标签: qt signals-slots qthread qobject