C++ 在Qt中,如何延迟成员函数';在收到信号之前,是否返回?
我想使用一个递归过程来迭代Qt中的大量图像:本质上,图像被重复四分之一(达到一个极限),并询问用户图像是否通过或失败-即如果图像以大尺寸通过,我们将以更小的尺寸再次调用函数(直到达到极限),如果失败,我们将返回并向上传递层次结构 这种方法似乎遇到了Qt的事件驱动方法的障碍——我看不出在等待用户输入时如何暂停循环——也就是说,没有什么比“等待按钮按下”更有效的方法了C++ 在Qt中,如何延迟成员函数';在收到信号之前,是否返回?,c++,qt,loops,recursion,C++,Qt,Loops,Recursion,我想使用一个递归过程来迭代Qt中的大量图像:本质上,图像被重复四分之一(达到一个极限),并询问用户图像是否通过或失败-即如果图像以大尺寸通过,我们将以更小的尺寸再次调用函数(直到达到极限),如果失败,我们将返回并向上传递层次结构 这种方法似乎遇到了Qt的事件驱动方法的障碍——我看不出在等待用户输入时如何暂停循环——也就是说,没有什么比“等待按钮按下”更有效的方法了 我知道这种方法在事件驱动编程中被视为一种反模式,但有什么替代方法不涉及在堆上保存大量的状态(而不是在堆栈上“免费”保存状态)?QEv
我知道这种方法在事件驱动编程中被视为一种反模式,但有什么替代方法不涉及在堆上保存大量的状态(而不是在堆栈上“免费”保存状态)?QEventLoop可能会对您有所帮助。我启动一个http连接,在一个超时的计时器旁边,所有这些都在一个线程内。然后等待其中一人完成并返回
void MyThread::run(){
QNetworkAccessManager qnaManager;
bool isPost = false;
QUrl url(myUrl);
QNetworkRequest req(url);
QNetworkReply *reply;
req.setHeader(QNetworkRequest::ContentTypeHeader,
"application/json");
req.setHeader(QNetworkRequest::ContentLengthHeader,
QVariant(postData.size()).toString());
reply = qnaManager.get(req);
QEventLoop eventLoop;
QTimer timer;
timer.setSingleShot(true);
const int timeout = 400;
timer.start(timeout);
connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
if (timer.isActive()){
//everything is ok
}else{
//timer elapsed, no replay
return;
}
}
无论如何,最后我决定最好的方法是实现更多的消息传递代码——等待用户输入发送消息。它的代码比我使用/提供的“传统”回调类型范例要长,但它最终运行得很干净。我不知道应用程序是如何工作的,但您可以使用
QMutex
或QWaitCondition
停止线程,直到单击按钮或其他什么来解锁互斥锁。我猜你应该使用一个后台线程来执行你的操作。你为什么不使用一个模式对话框来进行用户输入呢?我已经考虑过了,但是要做到这一点需要很大的计算能力,你可以在循环中从递归方法调用qApp->processEvents(),直到你的槽被调用为止;这是一种丑陋且容易出错的方法(例如,当所有数据都在堆栈上时,如果用户决定退出应用程序会发生什么情况?),但它可能适用于您的用例。在我看来,使用模型对话框或自己的QEventLoop
似乎是最好的解决方案。我不明白你为什么认为它需要很大的计算能力。