Post 在 exec() 之前 quit() 到 QEventLoop
Post quit() to QEventLoop before exec()
我创建了一个 QEventLoop
对象并尝试在启动它之前放置 quit()
消息,所以我的目的是进入和退出一个循环:
QEventLoop loop;
loop.connect(this, SIGNAL(sig()), SLOT(quit()));
emit sig();
loop.exec(); // can't get past this point
但是线程在循环中循环并且永不退出...
我怎样才能实现预期的行为?
单独来看这似乎没有多大意义,但为了回答您的问题,您可以连接 Qt::QueuedConnection
,然后 quit
呼叫将在 运行事件循环然后循环会正确退出。
这是有效的,因为插槽是按照 connect
调用的顺序执行的,所以另一个恰好连接到 sig()
的插槽可以做任何它想做的事情,甚至可以启动自己的事件循环。但是,最后一个连接是你的,它对 quit
的排队调用将最后发生,在对 quit
的排队调用和对 loop.exec
的调用之间没有其他事件循环操作。
请记住,本地 QEventLoops
就像调用 QApplication::processEvents
一样非常危险。如果您可以更改代码,请尝试设置一个状态机来执行异步工作。
我创建了一个 QEventLoop
对象并尝试在启动它之前放置 quit()
消息,所以我的目的是进入和退出一个循环:
QEventLoop loop;
loop.connect(this, SIGNAL(sig()), SLOT(quit()));
emit sig();
loop.exec(); // can't get past this point
但是线程在循环中循环并且永不退出...
我怎样才能实现预期的行为?
单独来看这似乎没有多大意义,但为了回答您的问题,您可以连接 Qt::QueuedConnection
,然后 quit
呼叫将在 运行事件循环然后循环会正确退出。
这是有效的,因为插槽是按照 connect
调用的顺序执行的,所以另一个恰好连接到 sig()
的插槽可以做任何它想做的事情,甚至可以启动自己的事件循环。但是,最后一个连接是你的,它对 quit
的排队调用将最后发生,在对 quit
的排队调用和对 loop.exec
的调用之间没有其他事件循环操作。
请记住,本地 QEventLoops
就像调用 QApplication::processEvents
一样非常危险。如果您可以更改代码,请尝试设置一个状态机来执行异步工作。