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

开启了事件循环的次线程与主线程的信号与槽的绑定。
在一个开启了事件循环的次线程向主线程发信号,怎样保证主线程对应的槽函数能够立即执行?
根据我自己的尝试,似乎设置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。不知道这是否是你想要的开启了事件循环的次线程与主线程的信号与槽的绑定。解决方案