⑴ 68請問Qt的多線程問題
QMutex mutex; mutex. lock (); global::threadflag = true;//將全局變數變為true mutex.unlock(); 有可能確實是return的太快了,子線程還沒來得及去結束,主進程已經return。加sleep試試。加個log看看這個showrelayThread->terminate();這句話...
⑵ Linux QT支持多少線程
這跟你的現實代碼有關,理論上沒有上限,當然,也得看你的處理器是否足夠強大
⑶ 如何對Qt中多線程系列進行限制和控制
淺析 Qt中多線程系列之線程初體驗上篇 寫了個線程的創建到運行的過程,可這還沒完,線程創建完了之後必須要對其進行限制和控制,我們就是線程的監護人,不能說任由它自由,得對它進行合理約束。接下來我們講線程的控制部分,
1、線程休眠
想像一下一種情形,日常用的電腦,如果我們需要離開一段時間,那麼可能會將它暫時休眠一下,為了節約用電,也響應一下環境保護,別忘了現在都講低炭生活。那麼線程其實也一樣,如果一個線程暫時不需要用到,我們可以先讓它睡會,其目的也是為了讓它暫時不要佔用資源,主要是一個cpu時間片的佔用問題。
對於線程的休眠,只要簡單調用 Qthread 的sleep ,msleep或者usleep 方法就可以了,注意這三個方法都是Static Protected的,這意味著你只能在繼承類里做這個動作,它們差別僅是時間單位不同而已。
程序方面我們盡量簡單點,能看清本質就可以了,在Qthread 派生類的Run方法裡面用下
1. void CThread::run()
2. {
3. for(int i=1;i<=10000;i++)
4. {
5. qDebug()<<i;
6. sleep(1); //請不要那麼快,睡一下再往下執行
7. }
8. }
2、線程喚醒
既然有線程的休眠,那就有喚醒。如果你已經和線程說 Sleep 10秒吧,突然人家睡到一半的時候,你又改變主意想讓它醒過來,這里我要抱歉的說聲是沒辦法的,它就像豬一樣,沒到時間是不會醒的。比較合適的方案就是線程同步能夠解決這樣的問題,這個放到下一篇 線程的同步[1/2] 的時候再說.只要記住sleep是強制休眠就可以,但現在沒辦法提供強制喚醒的辦法.
3、線程關閉
如果一個線程運行完了它會自己結束自己的生命。可很多情況不是這么簡單,一個線程跑到中間的時候由於某種特殊原因,就想它中止。
(1)線程中止方式
中止有兩種方式 強制中止和 優雅中止,這用詞可能有點不恰當,先這么說著。在說明這兩種方式之前,有必要詳細說一下線程關閉的時候它到底幹了什麼。
線程關閉的時候,OS會移除這個線程,這部分對我們是透明的,詳細的說明還得參閱操作系統的有關書籍,接著線程中分配的堆棧信息將一並清除,但是如果是堆上分配的信息,得由你負責自己清除,因為堆是由進程持有的,它的生命周期和線程沒關系。
(2)強制中止:
簡單的調用Qthread 的方法terminate就可以進行強制中止,可這將會帶來很多災難性的後果。最為嚴重的就是一個堆內存泄露的問題,線程強制被中止,根本沒法來得及做清理工作,即使你的線程中有執行到最後清理堆內存,可它沒來得及執行
比如以下一段代碼
1. void CThread::run()
2. {
3. int *c = new int;
4. for(int i=1;i<=10000;i++)
5. {
6. qDebug()<<i;
7. }
8. //clean
9. delete c;
10. }
想像一下線程還沒執行 到 delete c;的時候你就發出了terminate,不幸的事就發生了,由此得出結論我們應該盡最大限度避免去使用。
(3)優雅的中止:
那麼怎麼優雅的關閉線程呢?我們應該通知線程,讓線程自己去接手關閉,各自關注自己所需的事,就都能做得更好,一手抓就會帶來很多問題
那麼怎麼通知線程呢? 一般會採用以下的步驟
1.在Qthread中派生類 定義一個公用方法出來 供中止時調用,比如stop()
2.調用者 直接 調用stop方法
3.派生類stop方法 ,設置 中止標志,一般就是bool成員
4.run方法 運行的時候,檢查bool成員,判斷是否需要退出進程,最後做清理工作
1. //CThread.h
2. #ifndef CTHREAD_H
3. #define CTHREAD_H
4. #include <QThread>
5. class CThread : public QThread
6. {
7. public:
8. CThread();
9. ~CThread();
10. void stop();
11. protected:
12. void run();
13. private:
14. bool mStop;
15. };
16. #endif // CTHREAD_H
17.
18. //CThread.cpp
19. #include <QDebug>
20. #include "CThread.h"
21. CThread::CThread():QThread(),mStop(false)
22. {
23. }
24. CThread::~CThread()
25. {
26. stop();
27. }
28. void CThread::run()
29. {
30. int *c = new int;
31. for(int i=1;i<=10000;i++)
32. {
33. if (mStop) // determine to exit the loop
34. {
35. break;
36. }
37. qDebug()<<i;
38. sleep(1);
39. }
40. //clean up
41. delete c;
42. }
43. void CThread::stop()
44. {
45. mStop = true;
46. wait();
47. }
⑷ qt中如何實現多線程
QT線程是獨立的類:
在QT中添加C++類,頭文件引用#include <QThread>;類公開,這樣寫:
class XXXX:public QThread,類裡面申明Q_OBJECT,直接寫在裡面。signals: XXX();這是你的訂閱事件名。private:void run();這是run函數;public: int cona=3;這是變數,一定要public。
cpp文件里引用頭文件,run函數裡面寫方法:
void XXXX::run()
{
do
{
msleep(cona);
emit connec();
}while(true);
}
上面就是線程類了。現在我們在窗體中應用,先在頭文件申明
頭文件private: XXXX *thread1;XXXX *thread2;
構造函數中初始化他們
thread1=new XXXX();
thread1->cona=3;
QObject::connect(thread1,SIGNAL(connec()),this,SLOT(XXX信號1()));
thread2=new XXXX();
thread2->cona=4;
QObject::connect(thread2,SIGNAL(connec()),this,SLOT(XXX信號2()));
XXX信號1()是讀A數據,XXX信號2()讀B數據。
按鈕1的信號槽里寫方法同時進行每3秒讀A、沒4秒讀B
thread1->start();
thread2->start();
要結束誰就用 xxxx->terminate();
看明白沒?QT可不同與C++,你不熟悉編程環境,是很難理解的。
⑸ Qt如何循環創建線程
在Qt中使用多線程,目前就我使用過的有兩種,一是子類化QThread,重寫run函數,在run函數里實現自己的代碼,這一部分代碼通常是比較耗時,或者乾脆直接阻塞的。比如一個while循環,設置一個標志,判斷循環結束。
這樣的例子在網上有很多,就不寫了。
這樣寫的話,會有一些東西需要了解。
子類化QThread的方法,只有run函數裡面的內容是執行在子線程里的,其他的部分,比如槽函數什麼的還是在主線程里執行(假設是在主線程開啟的該子線程)。
還有一種方法,是子類化QObject,新建一個線程,然後使用MoveToThread把這個類的對象移到新建的線程中,這種做法使得它所有的槽函數都是執行在新開辟的線程裡面。
如果直接(QObject對象).abc()的話,這個成員函數是在主進程內執行,可能會出現"QObject::killTimer: timers
cannot be stopped from another thread"的運行錯誤。
使用第二種方法的話,貌似會遇到這樣的問題:如果在一個槽函數中把子線程阻塞,其他的槽函數無法接受來自主線程
⑹ qt多線程
這個好像不用多線程那麼復雜吧...如果只是這個功能,一個主線程就夠了的
⑺ 誰能說一下在Qt中使用多線程有哪些需要注意的事項呢
在Qt中使用多線程,目前就我使用過的有兩種,一是子類化QThread,重寫run函數,在run函數里實現自己的代碼,這一部分代碼通常是比較耗時,或者乾脆直接阻塞的。比如一個while循環,設置一個標志,判斷循環結束。
這樣的例子在網上有很多,就不寫了。
這樣寫的話,會有一些東西需要了解。
子類化QThread的方法,只有run函數裡面的內容是執行在子線程里的,其他的部分,比如槽函數什麼的還是在主線程里執行(假設是在主線程開啟的該子線程)。
還有一種方法,是子類化QObject,新建一個線程,然後使用MoveToThread把這個類的對象移到新建的線程中,這種做法使得它所有的槽函數都是執行在新開辟的線程裡面。
如果直接(QObject對象).abc()的話,這個成員函數是在主進程內執行,可能會出現"QObject::killTimer: timers
cannot be stopped from another thread"的運行錯誤。
使用第二種方法的話,貌似會遇到這樣的問題:如果在一個槽函數中把子線程阻塞,其他的槽函數無法接受來自主線程
⑻ Qt多線程里為什麼我創建了多個線程,可每個線程的執行效率很低
多線程也是有代價的,在CPU和操作系統 上有明確的要求,否則反而達不到多線程的優勢。
⑼ qt多線程編程中怎麼設置線程數
qt線程類為QThread
不存在設置線程數的問題
當你需要新建一個線程時,直接new一個實例即可
⑽ qt多線程編程裡面怎麼設置線程數
我學習QT的線程模塊沒多久。實現方案是繼承QThread類,編寫一個新的Thread線程類。
然後在主進程中要調用的時候就創建一個新的Thread並調用run函數啟動線程。可以用數組存放這些thread,這樣可方便主線程對這些線程的管理。