2016-03-02 334 views
1

我创建了一个QEventLoop对象,并试图把quit()消息,启动它,所以我的目的是为了进入和退出一个循环之前前:后退出()来QEventLoop EXEC()

QEventLoop loop; 
loop.connect(this, SIGNAL(sig()), SLOT(quit())); 
emit sig(); 
loop.exec(); // can't get past this point 

但是线程在循环循环,永不退出...
我该如何达到预期的行为?

+0

这是什么目的? – thuga

+0

@thuga我想从不同的线程调用'QNetworkAccessManager'的'post()'和'get()'。但是这些方法需要从拥有的线程中调用。所以我创建了'wrapperClass',它包含'QNetworkAccessManager'。当用户调用'wrapper.sendPostRequest(...)'时,我的线程应该等待'QNetworkAccessManager'执行调用,之后我可以继续。循环似乎是一个合理的方式来暂停线程,并等待'唤醒'信号... :) –

回答

2

这似乎没有什么意义,但为了解答您的问题,您可以连接Qt::QueuedConnection,然后在运行事件循环时接收到quit调用,然后循环将退出正确。

这是可行的,因为插槽按connect调用顺序执行,所以另一个插槽也可以连接到sig(),可以做任何想要的事情,甚至可以启动自己的事件循环。但是,最后一次连接是您的,并且其排队呼叫quit将最后发生,排队呼叫quit和呼叫loop.exec之间没有其他事件循环操作。

请记住,本地QEventLoops,就像致电QApplication::processEvents,是非常危险的。如果您可以更改代码,请尝试设置状态机以执行异步工作。

+0

感谢您的答案。我会稍后测试你的建议,并在答案的标记。我添加了解释,为什么我在这个问题的评论中选择了'QEventLoop',你怎么看? %) –