2013年12月19日 星期四

如何離開有使用 thread 的 qt 程式

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, 我不確定這是不是正確作法, 不過看來是有效的。

1 ~Widget()
2 {
3   qDebug() << "wait thread end" << objectName();
4   thread->exit(0);
5   while (thread->isFinished() == false);
6   qDebug() << "delete thread";
7   delete thread;
8 }

要結束某個 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 帳號。