2016-08-30 4 views
1

나는 청취 서버가 QThread입니다. 즉시 QThread의 작업을 일시 중지하고 싶습니다. 전혀 기다리지 않고 종료하는 것처럼 거의 즉각적이어야합니다.Qt, 즉시 QThread를 일시 중지하는 방법

+2

몇 가지 코드를 제공 할 수 있습니까? 지금 당신이 의미하는 것이 명확하지 않습니다. 알다시피, msleep 메서드는 즉시 스레드의 작업을 일시 중지합니다. 그것은 당신이 원하는 것입니까? –

+1

_ "칼처럼 커야합니다."_ O_o –

+0

QThread의 실행 기능이 신호를 내 보냅니다. 나는 신호로 방출 된 알렉스 작품을 끝내고 싶다. –

답변

11

주어진 스레드에서 실행중인 코드는 코드 및/또는 C/C++ 런타임 또는 사용 된 다른 라이브러리에서 공유 데이터 구조의 상태를 손상시키지 않고 임의의 지점에서 중지 할 수 없습니다.

코드는 잘 정의 된 지점에서만 멈출 수 있습니다.

(당신이 QThread에서 파생하지 않거나 그 run를 오버라이드 (override)하지 않는 경우, 즉 보통) 그것으로 안전 이벤트 루프로 제어를 반환하면, 다음 QThread::quit() 스레드를 중지 스레드는 이벤트 루프를 실행하는 경우 그렇게해라. 스레드의 재 구현이 실행이 루프를 실행하면 중단 요청했을 때

, 그것은 반환해야합니다 :

void MyThread::run() { 
    while (! isInterruptionRequested()) { 
    ... 
    } 
} 

이러한 스레드는 QThread::requestInterruption()에 의해 stoppable입니다.

  • wait() 호출 스레드를 차단 호출 스레드가 완료 될 때까지 :

    참고로, 여기에 때때로 혼란 QThread의 다양한 방법이 있습니다. 물론 스레드 자체에서 호출하는 것은 즉각적인 교착 상태입니다. 스레드는 결코 발생하지 않을 무언가를 기다리는 경우 완료 할 수 없습니다.

  • quit()은 가능한 한 빨리 스레드의 이벤트 루프를 종료하고 QThread::run()을 반환합니다. run()을 다시 구현하고 이벤트 루프를 돌리지 않으면 아무 작업도 수행하지 않습니다.

  • requestTermination()은 의 맞춤 루프가 isTerminationRequested()을 통해 확인할 수있는 플래그를 설정합니다.

  • terminate() 스레드를 중지합니다. 이제입니다. 이것은 일반적으로 응용 프로그램의 상태를 손상 시키므로 언제든지 abort()이 곧 발생하거나 그 결과에 직면해야합니다. 이 방법은 잊어 버리는 것이 가장 좋습니다. 근본적으로 "곧이 프로세스가 중단되고 일부 디스크 데이터가 손상 될 수 있습니다"라는 의미입니다.