在專案中碰到了乙個問題,如果初始化乙個執行緒,這個執行緒不執行完畢的話,那麼再次呼叫其餘執行緒則不會執行。猜想其可能被阻塞,後來查詢了一些資料發現原因如下。
這是我開啟執行緒的方式:
customrunnable* runnable = new customrunnable();
runnable->setcallbackfunction(serialportreadthread, this);
qthreadpool::globalinstance()->start(runnable);
其中customrunnable繼承了qrunnable,qthreadpool::globalinstance()用於獲取qt中的全域性qthreadpool物件,serialportreadthread是我需要執行的函式,用於阻塞讀取串列埠中的資料並處理,如果先執行了這些,那麼接下來的執行緒都不會被執行.
查詢資料得可能是在arm上面跑的原因,執行緒最大個數預設為1,這個和處理器有關係.通過qthreadpool::globalinstance()->maxthreadcount()可檢視當前環境最大執行緒數,那麼顯然就找到了原因,serialportreadthread是乙個死迴圈,唯一執行緒資源永遠被占用,後面執行的執行緒都不會被執行了.
通過設定執行緒最大個數可以解決這個問題:qthreadpool::globalinstance()->setmaxthreadcount(2);我在這裡將他設定為2
qwarning() << qthreadpool::globalinstance()->maxthreadcount() << "maxthreadcount";
//set maxthreadcount
qthreadpool::globalinstance()->setmaxthreadcount(2);
qwarning() << qthreadpool::globalinstance()->maxthreadcount() << "maxthreadcount";
列印如下:
warning: 1 maxthreadcount
warning: 2 maxthreadcount
問題解決.
因為一直覺得執行緒個數是無限多的,所以犯了這個錯誤,留個筆記,以後不要再犯,
Qt多執行緒程式設計中的物件執行緒與函式執行執行緒
為了更清楚的理解這些問題,在此特編了個小例子說明一下。首先定義乙個從qobject繼承的類someobject,包含乙個訊號somesignal和乙個成員函式callemitsignal,此函式用於傳送前面的somesignal訊號。定義如下 define object class class so...
Qt多執行緒程式設計中的物件執行緒與函式執行執行緒
2017 05 10 16 40 25人閱讀收藏 編輯刪除 qt 24 作者同類文章x 而對於伺服器來說,多執行緒的這個特性太有用了,因為多執行緒使得伺服器可能同時響應多個客戶端的請求,所以現在伺服器大多採用多執行緒,所以才會造成我開始的誤解。不管是多執行緒,還是伺服器,qt中已經封裝好了特定的類,...
Qt中的多執行緒程式設計
qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...