2017-07-06 23 views
0

我想要使用递归过程来遍历Qt中的大量图像:本质上,图像被重复四等分(达到极限),并询问用户图像是否通过或失败 - 即如果图像通过大尺寸我们再次调用我们的函数以更小的尺寸(直到我们达到极限),如果它失败,我们返回并传回层次结构。在Qt中,我怎样才能延迟成员函数的返回,直到收到一个信号?

这种方法似乎遇到了Qt的事件驱动方法的障碍 - 我看不出如何在等待用户输入时暂停循环 - 即没有什么像“wait_for_button_press”方法。

我知道这种方法被认为是事件驱动编程中的一种反模式,但是什么是另一种不涉及在堆上保存大量状态的方法(而不是让它持有对于堆栈中的“免费”)?

+1

我不知道你的应用程序是如何工作的,但是你可以使用'QMutex'或'QWaitCondition'来暂停这个线程,直到你点击一个按钮或者任何解锁这个互斥体。无论如何,YOu应该使用后台线程来执行您的操作,我猜测。 – xander

+2

为什么不使用用户输入的模式对话框? – vahancho

+0

已经考虑过了,但是为了做到这一点,计算能力很强 – adrianmcmenamin

回答

0

对于什么是值得的,最后我决定最好的路线是实现更多的消息传递代码 - 等待用户输入来发送消息。它比我使用/使用'传统'回调类型范例的代码长,但最终它的工作很干净。

1

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; 
    } 

} 
相关问题