2013-05-08 5 views
1

QThread이 포함 된 클래스가 있습니다. 이 클래스의 초기화 함수에서 스레드가 시작되어야합니다. 이 올바른 작동합니다. 거기 스레드에서 내가 while(bool certainCondition){}certainCondition 신호/슬롯 연결로 변경해야합니다.Q 슬롯 및 신호로 인해 스레드가 중단됩니다.

문제는 잠시 동안 신호/슬롯이 열리지 않는다는 것입니다.

+0

'신호/슬롯이 열리지 않음'을 보여주는 코드를 게시 할 수 있습니까? – spiritwolfform

+4

특정 조건을 기다리는 것이 필요합니까? 나는 [QWaitCondition] (http://qt-project.org/doc/qt-4.8/qwaitcondition.html)이 여기서 유용 할 수 있다고 생각한다. – eraxillan

답변

3

스레드에서 이벤트 루프를 실행하고 있지 않거나 while 루프에서 오랫동안 블로킹하고 있습니다. 이벤트 루프에 대한 제어권을 반환 할 때까지는 슬롯을 호출 할 수 없습니다.이 루프는 후에 while 루프를 완료 한 후 이됩니다.

임시 해결책으로 while 루프 내에 QCoreApplication::processEvents()을 호출 해 볼 수 있습니다.

1

신호/슬롯이 스레드에서 작동하려면 이벤트 루프를 실행해야합니다.
while 루프를 사용하면 이벤트 루프가 실행되지 않으므로 신호가 수신되지 않습니다.
이것은 당신이 일반적으로 이벤트 루프 실행하는 방법입니다 : 이제

void Thread::run() 
{ 
    ...do something 
    exec(); //<<this runs the event loop 
} 

을, 문제는 몇 가지 조건이 충족 될 때까지 지속적으로 몇 가지 코드를 실행하려는 것입니다. 위의 코드에서는 exec() 호출로 인해 작동하지 않습니다.
이 그 (당신이 당신의 루프에서 달성하고자하는 내용에 따라) 해결이 가능성이 있습니다

  1. 을 QTimer를 사용하여 화재가의 5 초마다 말을하자 즉, 당신의 반복 코드를 실행 슬롯을 호출 .

  2. QWaitCondition을 사용하여 특정 조건이 충족되는지 확인하십시오. 하지만 신호와 슬롯을 사용할 수는 없습니다. 대신 QWaitCondition을 트리거해야합니다.

관련 문제