题
脱文件的国家的信号,并插槽可以 direct
, queued
和 auto
.
它还指出,如果对象是拥有老虎'生命'在一个线程的不同对象,拥有信号,发出这种信号将发布消息-信号发会返回,立即和老虎的方法将被称为目标的线的事件循环。
不幸的是,文件没有指定,'生命'的代表和没有实例。我已经尝试了下列代码:
main.h:
class CThread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
msleep( 200 );
std::cout << "thread 1 started" << std::endl;
MySignal();
exec();
}
signals:
void MySignal( void );
};
class CThread2 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 2 started" << std::endl;
exec();
}
public slots:
void MySlot( void )
{
std::cout << "slot called" << std::endl;
}
};
main.cpp:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CThread1 oThread1;
CThread2 oThread2;
QObject::connect( & oThread1, SIGNAL( MySignal() ),
& oThread2, SLOT( MySlot() ) );
oThread1.start();
oThread2.start();
oThread1.wait();
oThread2.wait();
return a.exec();
}
输出为:
thread 2 started
thread 1 started
MySlot()
是从来没有称为:(.我做错了什么?
解决方案
有相当多的问题与你的代码:
- 像所说的埃文的这些关键词是失踪
- 你所有的对象生活在主要线,只码在运行方法生活在其他线,这意味着MySlot隙就会被称为主线和我不确定这是你想要什么
- 你将永远不会被称为因为主要事件循环将永远不会被推出:你的两个电话要等()将仅超时后很长的时间(你可能会杀了你的申请之前发生的),并且我不认为那是你想要什么,反正他们真的没有使用你的代码。
这个代码很可能工作(虽然我没有测试过的话)而且我认为它做什么,你想要它做的事:
class MyObject : public QObject
{
Q_OBJECT
public slots:
void MySlot( void )
{
std::cout << "slot called" << std::endl;
}
};
class CThread1 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 1 started" << std::endl;
int i = 0;
while(1)
{
msleep( 200 );
i++;
if(i==1000)
emit MySignal();
}
}
signals:
void MySignal( void );
};
class CThread2 : public QThread
{
Q_OBJECT
public:
void run( void )
{
std::cout << "thread 2 started" << std::endl;
exec();
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CThread1 oThread1;
CThread2 oThread2;
MyObject myObject;
QObject::connect( & oThread1, SIGNAL( MySignal() ),
& myObject, SLOT( MySlot() ) );
oThread2.start();
myObject.moveToThread(&oThread2)
oThread1.start();
return a.exec();
}
现在MyObject将生活在thread2(由于moveToThread).
MySignal应送从thread1(以为我不知道在那之一,它可能会被发送自主线,它并不真正的问题).
没有的事件循环是必要的,thread1由于发光信号并不需要一个活动循环。一个事件循环是必要的,thread2(lanched通过exec()),以接收信号。
MySlot将在thread2.
其他提示
不要子类的QThread Qt的4.4 +
虽然Aiua的回答是不错的,我想指出用的QThread和Qt 4.6或4.7的一些问题。
此文章概括起来: HTTP:/ /blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/
缺乏文件上Qt的部分
不幸的是,从问题缺乏更新的文档的茎。 QT间期之前4.4的QThread没有默认的run()执行,这意味着,你必须继承的QThread才能使用它。
如果您正在使用Qt 4.6或者4.7,那么你几乎可以肯定是应该的不的子类的QThread。
使用moveToThread
要获得时隙在工作线程执行的关键是使用moveToThread方法Aiua指出。
您应该发出信号,开始喜欢你的线程函数
emit operateCut(examId,examName_examTemplate[examName].studentIdRec,examName_examTemplate[examName].choiceRecA,examName_examTemplate[examName].choiceRecB,examName_examTemplate[examName].objectRecA,examName_examTemplate[examName].objectRecB);
则可以在该信号加到多个参数