2013-05-24 2 views
0

내 코드에서 작업자 스레드는 신호를 내 보냅니다. Qt Docs에서Qt 블로킹 연결 교착 상태

:

Qt는 :: BlockingQueuedConnection - QueuedConnection과 동일 슬롯 반환 될 때까지 현재 스레드 블록을 제외하고. 이 연결 유형은 송신자와 수신자가 다른 스레드에있는 경우에만 사용해야합니다. 참고 :이 규칙을 위반하면 응용 프로그램이 교착 상태가 될 수 있습니다.

방출기와 수신자가 다른 스레드에있는 경우를 판별하는 방법. Qt::BlockingQueuedConnection 플래그를 추가 할 때까지 내 응용 프로그램에 문제가 있었기 때문에 그것에 대한 모호한 아이디어가 있습니다. 그러나 내 응용 프로그램이 닫히고 싶지 않다는 것을 알고 있습니다. 그것은 작동 스레드와 붙어있다.

UPDATE :

좀 더 문제를 조사. 스레드는 방출 된 신호에 의해 차단됩니다. 왜냐하면 응용 프로그램을 닫을 때 MainWindow의 슬롯이 파괴되어 신호를 내보내므로이 교착 상태가 발생하기 때문입니다.

이 문제를 해결하는 방법은 무엇입니까?

답변

3

일반적으로 을 알고 있습니다. 개체를 만든 곳과 사용 여부는 QObject::moveToThread입니다. 프로그래밍을 확인하려는 경우, 당신은 같은 것을 할 수 있습니다

Qt::ConnectionType type = Qt::AutoConnection; 
if (sender->thread() != receiver->thread()) 
    type = Qt::BlockingQueuedConnection; 

모든 스레드를 종료하지 않기 때문에 프로그램이 아마 닫히지 않습니다. 가까운 이벤트에서 각각에 대해 QThread::quit으로 전화해야합니다.