在一个开启了事件循环的次线程向主线程发信号,怎样保证主线程对应的槽函数能够立即执行?
根据我自己的尝试,似乎设置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();
}
------解决方案--------------------
没办法保证。如果你的主线程忙于执行其他东西的话,它可能很久很久以后才被执行。
这个用法是错误的,因为你正试图让那个槽函数在你的次线程中执行
------解决方案--------------------
次线程往主线程发送自定义事件,然后在事件处理中doSomething。不知道这是否是你想要的