env:
ubuntu 12.04 64 bit
qt 4.8.1
這篇提到用 QThread 的四個方法:
http://blog.csdn.net/jiong_1988/article/details/7942738
soure code:
https://github.com/descent/progs/tree/master/qt_thread1
commit 73c8d8a181b94ea8c782c4c3aeae66dbce6bf47a
很好用, 以下是執行結果。
descent@descent-u:qt_thread1$ ./qt_thread1
main: 139740863580032
slots1: 139740729222912
descent@descent-u:qt_thread1$ ps -eLf|grep qt_thread
descent 21876 21553 21876 2 2 16:09 pts/41 00:00:00 ./qt_thread1
descent 21876 21553 21877 0 2 16:09 pts/41 00:00:00 ./qt_thread1
用 ps 查看, 的確有兩個 thread。
但是這篇文章沒說明怎麼離開 thread。
在按下 X 按鈕時要結束程式時, 會看到
QThread: Destroyed while thread is still running
不過程式也的確結束了。
但一定會有點擔心吧? 這樣真的有正常結束程式嗎?
https://github.com/descent/progs/tree/master/qt_thread1
commit e8c84a55923adf2edd9284cc59e1805ba334a576
這個版本做了一點修正, 結果如下。
descent@descent-u:qt_thread1$ ./qt_thread1
main: 140534343182208
slots1: 140534208825088
wait thread end ""
delete thread
沒有 QThread: Destroyed while thread is still running 這訊息, 看來有正常的結束程式。
基本原理就是要結束這個 thread 做的事情, 並離開 thread event loop, 我不確定這是不是正確作法, 不過看來是有效的。
要結束某個 thread 做的事情有不同作法, 如果是繼承 QThread::run() 這樣的方法來使用 QThread, 得先離開 QThread::run(), 否則 QThread::run() 一直執行中, thread->isFinished() 就不會 return true。
這和我之前的想法不同, 我以為在 thread 執行的那段程式碼結束後, 這個 thread 就會結束, 直到我用 ps -eLf 觀察才知道不是這麼一回事。
至於 thread 是什麼時候產生的? 並不是 new QThread(this), 而是呼叫 start() [thread->start();] 才產生。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。