Qt的文档表明信号和槽可以是直接(direct)
、队列(queued)
和自动(auto)
的。
它还指出,如果拥有槽的对象所在的线程与发射信号的对象不同,那么发射该信号将会像发送消息一样——信号的发射会立即返回,并且槽方法将在目标线程的事件循环中被调用。
遗憾的是,文档没有准确解释"所在(lives)"是什么意思,并且没有提供示例。我已经尝试了以下代码:
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;
}
};
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()
从未被调用 :(。我做错了什么?