2011-09-26 4 views
2

QThread 재 구현에서 몇 가지 작업을하고 있습니다. 이제는 사용자에게 예/아니오 질문을하고 싶습니다. 그래서 QMessageBox :: question()을 사용할 계획이었습니다. 문제는 스레드에서 호출 할 수 없다는 것입니다. 그것은 큰 것이 아니며, 메시지 상자를 표시 할 메인 GUI 스레드의 슬롯에 연결하는 신호를 낼 수 있습니다. 그러나 사용자 정의 스레드를 차단하고 메시지 상자가 닫히고 리턴을 기다릴 필요가 있습니다. 값 또한 여기에 (QMessageBox :: StandardButton). 어떻게해야합니까?QThread 블록을 만들고 주 스레드에서 호출 된 함수가 값을 반환 할 때까지 기다리는 방법은 무엇입니까?

편집 : 다음 (가상) 코드가 속임수가됩니까?

class MyThread 
{ 
public: 
    MyThread(QObject *parent) 
    { 
     connect(this, SIGNAL(inputRequired()), parent, SLOT(popMsgBox()), Qt::QueuedConnection); 
    } 

void MyThread::run() 
{ 
    QMutex m; 
    for (...) 
    { 
     if (something) 
     { 
      m.lock(); 
      emit inputRequired(); 
      w.wait(&m); 
      m.unlock(); 
     } 

     if (MyGui->ans_ == Yes) do_something(); 
    } 
} 

signals: 
    void inputRequired(); 

protected: 
    QWaitCondition w; 

}; 

void MyGui::popMsgBox() 
{ 
    ans_ = QMessageBox::question(this, "Question", "Yes or no?", Yes | No); 
    MyThread->w->wakeAll(); 
} 

답변

2

은 또한 Qt::BlockingQueuedConnection 연결 유형을 사용할 수 있습니다. 이 연결은 다른 스레드의 슬롯이 실행을 마칠 때까지 대기합니다. 교착 상태가되지 않도록주의하십시오.

2

간단한 대답 - 조건을 사용하십시오. 어쨌든 신호와 슬롯을 사용하여 작업하는 경우

http://doc.qt.io/qt-5/qwaitcondition.html

+0

문서를 보면 완전히 혼란 스럽습니다. :(당신은 편집에서 의사 코드를 볼 수 있고 그것에 관련이 있습니까? 고마워요. – neuviemeporte

관련 문제