Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QT中停止和启动循环?_C++_Qt - Fatal编程技术网

C++ 如何在QT中停止和启动循环?

C++ 如何在QT中停止和启动循环?,c++,qt,C++,Qt,我一直在试图找出如何使程序在for循环中停止,并等待单击按钮,for循环继续 是否有任何简单的方法来停止循环,如QSystem.stop(),然后在按钮中单击函数QSystem.star(),循环继续 在C++中,你可以使用系统(“暂停”)或者在使用 CIN < P>时停止程序,因为用户接口需要其代码运行,如果停止事件循环(也意味着从事件循环中调用的任何函数都阻塞,等待某个事件),也会停止用户界面,这意味着不会处理对窗口的单击。这就是为什么在基于事件的编程中(这是所有UI工具包都要做的),必须尽

我一直在试图找出如何使程序在for循环中停止,并等待单击按钮,for循环继续

是否有任何简单的方法来停止循环,如
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。我从来没有遇到过这样的问题,但我从来没有过度使用过它。不管怎样,对于新手来说,玩线程更好更安全。我认为从教学角度来说,新手应该真正学习异步编码以及如何使用零长度计时器。那么线程问题就不是问题了:如果方便的话,可以将对象移动到新线程。很可能你是对的。我敢肯定他问错了问题。我的意思是,他有一些简单的问题,他试图以这种奇怪的方式解决,所以他要求我们修正他的解决方案,而不是解释真正的问题。如果调试器是他真正需要的东西,我不会感到惊讶。