2014-10-22 1 views
0

내가 Qt는에QMessageBox가 Qt의 전체 주 스레드 실행을 차단합니까?

내 상황은 새로운 오전 :

reply = QMessageBox::question(this, tr("Sure want to quit?"), tr("Sure quit?"), QMessageBox::Yes|QMessageBox::No); 
: 어떤 이유로, 나는 같은 시간에 내가 사용 QMessageBox 창을 만들고 싶습니다, 메인 쓰레드에서 하트 비트 신호를 방출해야

이 메시지 상자가 다른 창에서 사용자의 입력을 차단하도록하지만 하트 비트 신호를 차단하고 싶지는 않습니다. 어떻게해야합니까? Qt에서 기본적으로이 작업을 수행합니까?

답변

2

QMessageBox :: question 내부적으로 이벤트 루프를 실행합니다. 그래서 모든 일이 계속됩니다. 당신은 이것에 대해 걱정할 필요가 없습니다.

그러나 이러한 기능을 사용하면 이상한 효과를 얻을 수 있습니다. 예 : 하트 비트가 다른 대화 상자가 이미 열린 경우에도 대화 상자가 열리는 대화 상자를 열 수 있습니다. 또한 TCP/IP 스택이 실행되고 있다고 가정 해보십시오. 이 스택이 할 수있는 모든 일이 계속 될 것입니다 ... 모든 기능 QMessageBox :: question()은 현재 실행 중입니다 ... 일부 기능의 중간에 있습니다.

우리 회사에서 QMessageBox :: question() (및 유사)을 사용하고 응용 프로그램의 대화 상자에서 exec()를 호출하지 못하도록하는 정책을 가지고 있습니다. 우리는 힙에 모달 대화 상자를 만들고 대신 그들의 신호를 사용합니다.

+0

필자의 경우, "대화 상자에서 exec()를 호출하여"하트 비트 신호를 중지하겠습니까? 회사에서 어떻게 이루어 졌는지에 대한 간단한 예를 들려 주시겠습니까? 정말로 감사드립니다. – Nyaruko

+2

@Nyaruko 아니요, 'QDialog :: exec'도 똑같습니다. 로컬 이벤트 루프를 작성합니다. 로컬 이벤트 루프가 좋지 않을 수 있습니다. 이유를 확인하려면 [이 기사] (https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0)를 읽을 수 있습니다. . – thuga

+0

특히 로컬 이벤트 루프에서 수행되지 않은 작업은'deleteLater' 실행입니다. 정확히'this'는'delete'd 크래시를 막습니다. (실제로 부모를 '삭제'하면 도움이되지 않지만'deleteLater'를 사용하면 도움이됩니다. –

관련 문제