自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談 Qt 子線程 信號隊列

移動開發(fā)
本文介紹的是Qt子線程 信號隊列,關(guān)于線程的更多資料請參考本文末尾,將會有介紹。先來看內(nèi)容。

Qt子線程 信號隊列是本文要介紹的內(nèi)容,聲明:以下純屬個人理解,看到的就當(dāng)錯的看。對 Qt 的多線程編程沒有深究,只了解了基本的用法,夠我用就行了。

之所以寫這篇文章是因為前幾天遇到一個疑問:如果其他幾個線程同時向一個線程發(fā)signal,而這個線程沒有自己的事件循環(huán),那是不是會丟失signal呢?

下面是我總結(jié)的兩種子線程的工作方式

1、讓子線程進(jìn)入事件循環(huán),這樣的話多余的signal就會進(jìn)入該線程的事件隊列,不會丟失。問題是這時子線程的槽函數(shù)都是在該子線程對象所在的線程(很可能是主線程)執(zhí)行,這樣似乎失去了多線程的意義。

  1. void run()  
  2. {  
  3.     exec();  
  4. }  
  5. void slot1();  //處理工作  
  6. void slot2();  //處理工作 

2、子線程沒有事件循環(huán),直接在run里處理工作,主線程可通過信號連接到該子線程的槽來控制flag,從而控制子線程的暫停和繼續(xù)。但是,如果還有另外幾個線程不時地向通過slot2()給somarg賦值的話,即使給slot2()加了鎖保證了不會被同時賦值,但那些同時進(jìn)入的賦值信號沒有隊列可進(jìn),這樣會不會就丟失了呢

  1. void run()  
  2. {  
  3.     while(1)  
  4.     {  
  5.     while(flag)  
  6.     {  
  7.         dosomething(somarg);  
  8.     }  
  9.     }  
  10. }  
  11. void slot1();  //控制flag  
  12. void slot2();  //給somarg賦值 

經(jīng)試驗,雖然第一種辦法不需要exec()進(jìn)入事件循環(huán)也可以觸發(fā)槽們在調(diào)用這個線程對象的線程工作,但是這樣無法保證同時傳進(jìn)去的信號不會丟失;加上exec()后,子線程進(jìn)入事件循環(huán),不會馬上結(jié)束,并且會有事件隊列,這樣可以保證信號不會丟失。唯一的缺點(diǎn)就是這些槽不工作在子線程。

擬對策:

建立一個隊列線程,CQueueThread,這個線程進(jìn)入自己的事件循環(huán),在這個類中有其它線程的對象作為成員變量,這些線程則沒有各自的事件隊列,直接在run中死循環(huán)工作,主線程信號連接到CQueueThread的槽來控制其他線程開始工作,這樣信號會進(jìn)入事件隊列不會丟失,而那些死循環(huán)的繁雜工作則各自在各自的線程中運(yùn)行。

這個CQueueThread可以用主線程代替(主線程必然是有事件循環(huán)的),主線程中有個槽作緩沖用,接收來自各方的命令,再魚貫發(fā)往目標(biāo)線程。

"run()開的才是新線程,QThread的構(gòu)造函數(shù)以及其他成員都在你的主線程中。"

小結(jié): Qt 子線程 信號隊列的內(nèi)容介紹完了,希望本文對你有所幫助。關(guān)于線程的更多資料,請參考編輯推薦。

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-13 10:03:19

Qt 多線程 編程

2011-06-30 11:23:29

Qt 線程

2011-06-30 17:31:32

Qt 多線程 信號

2010-07-15 15:32:10

Perl線程

2011-06-28 15:37:34

Qt 內(nèi)存

2011-06-21 16:51:21

Qt 靜態(tài) 編譯

2011-07-05 10:22:44

Qt Sqlite

2011-07-04 15:30:24

Qt 布局 GridLayout

2023-10-23 10:02:58

RabbitMQ延遲隊列

2011-07-05 18:32:52

QT 信號 機(jī)制

2011-06-09 09:45:35

Linux QT 信號

2023-11-15 13:55:32

2011-09-07 16:36:00

Qt Widget

2011-07-05 18:40:19

QT 信號 機(jī)制

2011-06-15 10:08:01

Qt CVS

2011-06-15 16:50:09

Qt 模塊

2011-06-28 17:21:50

QT UI designer

2011-06-23 10:49:13

Qt 自定義信號

2011-06-15 14:38:01

QT 信號

2011-08-29 10:34:36

QTQWebKitJavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號