2012-11-03 2 views
0

웹에서 데이터를 가져 오는 QThread이 있습니다. 때로는 사용자가 다른 것을 요청하고 데이터를 가져와야하는 경우도 있습니다.QThread가 isRunning을 호출 할 때 전화를 끊습니다.

현재 구성에서 스레드에 terminate()을 호출하고 입력 데이터를 변경 한 다음 start()을 다시 호출합니다. 이제는 정상적으로 작동하지만 가끔 종료 된 스레드에서 isRunning() 또는 isFinished()을 호출 할 때 메인 이벤트 루프가 멈추는 경우가 있습니다. 영원히 갇혀서 그 과정을 죽일 때까지 회복되지 않습니다.

  1. isRunning() 또는 isFinished()는 처음에 걸린 것인가? 그들은 차단할 생각이 없습니다.
  2. 이 워크 플로를 사용할 수 있습니까? 그렇지 않다면, 더 이상 필요하지 않을 때 스레드의 프로세스를 중지시킬 수 있습니까 (아니면 어떻게 포기할 수 있습니까)?

답변

0

종료 후 스레드를 사용할 수 없게되고 TERMINATED 신호 후에 만 ​​호출되는 경우에도 호출 스레드가 isRunning()isFinished()에 걸릴 수 있습니다.

제 해결 방법은 스레드를 종료하고 잊어 버린 후 새 스레드를 시작하는 것입니다.

1

을 사용하지 말고 documentation의 경고를 읽으십시오.

QThread을 다시 시작할 수는 있지만 일반적으로 스레드를 다시 시작하는 것은 좋지 않으므로 수행하려는 작업을 수행 할 수있는 더 나은 해결책이 있어야합니다.

+0

내 스레드에 뮤텍스가 없습니다. 웹에서 데이터를 가져 와서 신호를 통해 주 스레드로 보냅니다. 언제든지 죽이는 것이 좋으며, 물건을 정리할 필요가 없습니다. 게다가 쓰레드를 죽이는 것은 isRunning()의 행동을 망가 뜨리는 것으로 생각하지 않는다. – iTayb

+0

QThread 자체가 가지고있는 뮤텍스는 어떨까요? 나는 [this] (http://qt.gitorious.org/qt/qt/blobs/4.8/src/corelib/thread/qthread.cpp#line465)가'isRunning'이 걸려있는 곳에 있다고 말하지만, 말하기는 어렵습니다. 나는 그것을 재현 할 수 없다. – mata

관련 문제