2012-11-03 20 views
0

我有一個QThread從網上提取數據。有時候用戶會要求別的東西,而且數據也需要被提取出來。QThread在調用isRunning時調用

在我當前的配置中,我在線程上調用terminate(),更改輸入數據,並再次在線程上調用start()。現在,這很好,但有時我會在終止的線程上調用isRunning()isFinished()時卡住主事件回調。它被永久卡住了,直到我殺死這個過程才恢復。

  1. 爲什麼會isRunning()isFinished()掛在首位?他們不會阻止。
  2. 這個工作流程是否可以接受?如果不是這樣,當我不再需要它時(或者我怎麼能放棄它),我怎麼能阻止一個線程的進程?

回答

0

看來,在某些情況下,線程成爲結束後無法使用,isRunning()isFinished()可能會掛起調用線程,即使只有TERMINATED信號後調用。

我的解決方法是終止一個線程,忘掉它並開始一個新線程。

1

請勿使用terminate(),請閱讀documentation中的警告。

是否有可能重新啓動QThread,重啓線程通常不是一個好主意,應該有更好的解決方案來做你想做的事情。

+0

我的帖子不包含任何互斥體。它從Web獲取數據並通過信號發送給主線程。隨時殺死它很好,並且不需要清理任何東西。另外,關閉線程並不會破壞'isRunning()'的行爲。 – iTayb

+0

QThread本身擁有的互斥體呢?我敢打賭[這](http://qt.gitorious.org/qt/qt/blobs/4.8/src/corelib/thread/qthread.cpp#line465)是'isRunning'懸掛的地方,但很難說,我無法複製它。 – mata

相關問題