当前位置: 代码迷 >> QT开发 >> 开启了事件循环的次线程与主线程的信号与槽的绑定。解决方案
  详细解决方案

开启了事件循环的次线程与主线程的信号与槽的绑定。解决方案

热度:73   发布时间:2016-04-25 03:26:50.0
开启了事件循环的次线程与主线程的信号与槽的绑定。
在一个开启了事件循环的次线程向主线程发信号,怎样保证主线程对应的槽函数能够立即执行?
根据我自己的尝试,似乎设置connect的连接方式为Qt::DirectConnection 会出问题,而在子线程发信号之前调用QApplication::processEvents()也不起作用。代码比较长,简化一下:
Thread::Thread(QObject *parent)
   :QThread(parent)
 {
 }
 
 void Thread::run()
 {
...
QProcess cmd;
cmd.start("ping 192.168.1.110");
connect(&cmd, SIGNAL(finished( int, QProcess::ExitStatus)), this, SLOT(emitSignal(int, QProcess::ExitStatus)));
exec()
 }
 
 void Thread::emitSignal(int exitCode, QProcess::ExitStatus exitStatus)
 {
emit pingFinished(exitStatus);
 }
 
 int main(int argc, char *argv[])
{
QApplication a(argc, argv);

MyQDialog *dialog;
Thread *thread;
connect(thread, SIGNAL(pingFinished(QProcess::ExitStatus)), MyDialog, SLOT(doSomething(QProcess::ExitStatusv)));

return a.exec();
}

------解决方案--------------------
引用:
在一个开启了事件循环的次线程向主线程发信号,怎样保证主线程对应的槽函数能够立即执行?


没办法保证。如果你的主线程忙于执行其他东西的话,它可能很久很久以后才被执行。

引用:
根据我自己的尝试,似乎设置connect的连接方式为Qt::DirectConnection 会出问题


这个用法是错误的,因为你正试图让那个槽函数在你的次线程中执行



------解决方案--------------------
次线程往主线程发送自定义事件,然后在事件处理中doSomething。不知道这是否是你想要的
  相关解决方案