2013-07-07 3 views
3

스레드에서 무한 루프 작업을 수행해야합니다. 는 this article에서 저자는QThread 이벤트 루프 및 무한 작업 루프

>you should never ever block the event loop 

그것이 신호 슬롯 개념을 차단하기 때문에 쓴다. QThread에서 이벤트 루프 + 무한 루프를 어떻게 사용할 수 있습니까?

+0

"신호 슬롯 개념을 차단합니다"는 실제로 구문 분석하지 않습니다. 어쨌든, 왜 아래의 나쁜 아이디어일까요? 그리고 스레딩과는 관계가 없습니다. "이벤트 전달이 멈추었을 때 위젯은 자동으로 업데이트되지 않으며 더 이상 위젯과의 상호 작용이 가능하지 않으며 타이머는 작동하지 않으며 네트워킹되지 않습니다 통신이 더디게 멈추고 많은 윈도우 관리자가 응용 프로그램이 이벤트를 더 이상 처리하지 못하는 것을 감지하고 응용 프로그램이 응답하지 않는다고 사용자에게 알립니다. " 귀하의 경우에는 스레드가 해당 스레드에있는 오브젝트에 대한 이벤트를 발송하지 않는다는 것을 의미합니다. – peppe

답변

1

QThread는 스레드 "컨트롤러"입니다. QObject가 무한 루프를 실행하기 때문에 이벤트 루프가 차단되지 않습니다. 물론 무한 루프를 QThread 하위 클래스에서 구현하지 않는 한.

귀하의 경우에는 그렇게하지 않아도됩니다. 대신 무한 루프를 QObject 하위 클래스에 구현 한 다음 해당 QObject를 QObject::moveToThread() 인 스레드로 옮기면됩니다. 그렇게하면 무한 루프가 QThread의 이벤트 루프를 차단하지 않습니다.

언제나처럼 : the canonical article on how to really use QThread.

+1

이벤트 루프를 차단하지 않고 스레드를 올바르게 일시 중지/다시 시작 하시겠습니까? – user14416

3

루프는 항상 여러 번 호출되는 함수로 대체 될 수 있습니다 (항상 편리한 것은 아니지만). 슬롯을 만들고 QTimer에 연결하십시오. 함수가 반복 작업을하도록하십시오.

timer = new QTimer(); 
connect(timer, SIGNAL(timeout()), this, SLOT(iteration())); 
timer->start(50); 

void MyClass::iteration() { 
    if (!timer->isActive()) { return; } 
    //do something 
} 

루프를 중지하려면 timer->stop()으로 전화하십시오.