C++ 如何在QT中停止和启动循环?
我一直在试图找出如何使程序在for循环中停止,并等待单击按钮,for循环继续 是否有任何简单的方法来停止循环,如C++ 如何在QT中停止和启动循环?,c++,qt,C++,Qt,我一直在试图找出如何使程序在for循环中停止,并等待单击按钮,for循环继续 是否有任何简单的方法来停止循环,如QSystem.stop(),然后在按钮中单击函数QSystem.star(),循环继续 在C++中,你可以使用系统(“暂停”)或者在使用 CIN < P>时停止程序,因为用户接口需要其代码运行,如果停止事件循环(也意味着从事件循环中调用的任何函数都阻塞,等待某个事件),也会停止用户界面,这意味着不会处理对窗口的单击。这就是为什么在基于事件的编程中(这是所有UI工具包都要做的),必须尽
QSystem.stop()
,然后在按钮中单击函数QSystem.star()
,循环继续
在C++中,你可以使用<代码>系统(“暂停”)或者在使用<代码> CIN < P>时停止程序,因为用户接口需要其代码运行,如果停止事件循环(也意味着从事件循环中调用的任何函数都阻塞,等待某个事件),也会停止用户界面,这意味着不会处理对窗口的单击。这就是为什么在基于事件的编程中(这是所有UI工具包都要做的),必须尽快返回主事件处理程序循环 您可以做的是创建第二个线程并等待条件变量。GUI线程可以在按钮单击事件槽中发出条件变量的信号 在C++中,你可以使用系统(“暂停”)或程序停止< /P> 确切地说:程序停止了。这意味着它不会从操作系统获取事件。但是,从stdin接收数据不是一个事件。它阻塞了流式I/O。不过图形用户界面是基于事件的
请注意,从概念上讲,考虑一个用户界面来提供流式I/O通道并不是不可能的。但是,这在单线程程序中不起作用。您需要并行执行(协程、线程等)才能让这样的概念发挥作用。您不需要线程,嵌套事件循环将完成这项工作
int waitUntilSignalIsEmitted(QObject *sender, const char *signal) {
QEventLoop loop;
connect(sender, signal,
&loop, SLOT(quit()));
return loop.exec();
}
// usage:
while(yourLoopCondition) {
// some stuff
...
// pause here
waitUntilSignalIsEmitted(yourContinuationButton, SIGNAL(clicked()));
// loop continuation
...
}
给落选的选民。这是一个好问题。OP不了解基于事件的编程的语义。一个完全正确的问题。以防万一:你知道什么是调试器吗?你知道如何使用它吗?谢谢datenwolf这对med很有帮助:)当然嵌套事件循环是一个最好避免的邪恶,因为它会导致很难确定的bug。你的代码是一个很好的例子,可以从其他工具包移植到Qt。我从来没有遇到过这样的问题,但我从来没有过度使用过它。不管怎样,对于新手来说,玩线程更好更安全。我认为从教学角度来说,新手应该真正学习异步编码以及如何使用零长度计时器。那么线程问题就不是问题了:如果方便的话,可以将对象移动到新线程。很可能你是对的。我敢肯定他问错了问题。我的意思是,他有一些简单的问题,他试图以这种奇怪的方式解决,所以他要求我们修正他的解决方案,而不是解释真正的问题。如果调试器是他真正需要的东西,我不会感到惊讶。