国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳解 Qt 線程間共享數據

移動開發
使用共享內存。即使用一個兩個線程都能夠共享的變量(如全局變量),這樣兩個線程都能夠訪問和修改該變量,從而達到共享數據的目的。

Qt 線程共享數據是本文介紹的內容,多的不說,先來啃內容。Qt線程共享數據主要有兩種方式:

使用共享內存。即使用一個兩個線程都能夠共享的變量(如全局變量),這樣兩個線程都能夠訪問和修改該變量,從而達到共享數據的目的;

使用singal/slot機制,把數據從一個線程傳遞到另外一個線程

***種辦法在各個編程語言都使用普遍,而第二種方式倒是QT的特有方式,下面主要學習一下這種方式:

在線程之間傳遞signal與在一個線程內傳遞signal是不一樣的。在一個線程內傳遞signal時,emit語句會直接調用所有連接的slot并等待到所有slot被處理完;在線程之間傳遞signal時,slot會被放到隊列中(queue),而emit這個signal后會馬上返回;默認情況,線程之間使用queue機制,而線程內使用direct機制,但在connect中可以改變這些默認的機制。

  1. view plaincopy to clipboardprint?  
  2. //TextDevice.h    
  3. #ifndef TEXTDEVICE_H    
  4. #define TEXTDEVICE_H    
  5. #include <QThread>    
  6. #include <QString>    
  7. #include <QMutex>     
  8. class TextDevice : public QThread {     
  9.     Q_OBJECT     
  10. public:     
  11.     TextDevice();     
  12.     void run();     
  13.     void stop();     
  14. public slots:     
  15.     void write(const QString& text);     
  16. private:     
  17.     int m_count;     
  18.     QMutex m_mutex;     
  19. };    
  20. #endif // TEXTDEVICE_H     
  21.     
  22.     
  23. //TextDevice.cpp    
  24. #include <QMutexLocker>    
  25. #include <QDebug>    
  26. #include <QString>    
  27. #include "TextDevice.h"     
  28. TextDevice::TextDevice() {     
  29.     m_count = 0;     
  30. }     
  31. void TextDevice::run() {     
  32.     exec();     
  33. }     
  34. void TextDevice::stop() {     
  35.     quit();     
  36. }     
  37. void TextDevice::write(const QString& text) {     
  38.     QMutexLocker locker(&m_mutex);     
  39.     qDebug() << QString("Call %1: %2").arg(m_count++).arg(text);     
  40. }     
  41.     
  42. //TextThread.h    
  43. #ifndef TEXTTHREAD_H    
  44. #define TEXTTHREAD_H    
  45. #include <QThread>    
  46. #include <QString>     
  47. class TextThread : public QThread {     
  48.     Q_OBJECT     
  49. public:     
  50.     TextThread(const QString& text);     
  51.     void run();     
  52.     void stop();     
  53. signals:     
  54.     void writeText(const QString&);     
  55. private:     
  56.     QString m_text;     
  57.     bool m_stop;     
  58. };    
  59. #endif // TEXTTHREAD_H     
  60.     
  61. //TextThread.cpp    
  62. #include "TextThread.h"     
  63. TextThread::TextThread(const QString& text) : QThread() {     
  64.     m_text = text;     
  65.     m_stop = false;     
  66. }     
  67. void TextThread::stop() {     
  68.     m_stop = true;     
  69. }     
  70. void TextThread::run() {     
  71.     while(!m_stop) {     
  72.         emit writeText(m_text);     
  73.         sleep(1);     
  74.     }     
  75. }     
  76.     
  77. //main.cpp    
  78. #include <QApplication>    
  79. #include <QMessageBox>    
  80. #include "TextDevice.h"    
  81. #include "TextThread.h"     
  82.     
  83. int main(int argc, char** argv) {     
  84.     QApplication app(argc, argv);     
  85.     //啟動線程     
  86.     TextDevice device;     
  87.     TextThread foo("foo"), bar("bar");     
  88.     //把兩個線程使用signal/slot連接起來     
  89.     QObject::connect(&foo, SIGNAL(writeText(const QString&)), &device, SLOT(write(const QString&)));     
  90.     QObject::connect(&bar, SIGNAL(writeText(const QString&)), &device, SLOT(write(const QString&)));     
  91.     //啟動線程     
  92.     foo.start();     
  93.     bar.start();     
  94.     device.start();     
  95.     QMessageBox::information(0, "Threading", "Close me to stop.");     
  96.     //停止線程     
  97.     foo.stop();     
  98.     bar.stop();     
  99.     device.stop();     
  100.     //等待線程結束     
  101.     device.wait();     
  102.     foo.wait();     
  103.     bar.wait();     
  104.     return 0;     
  105. }    
  106. //TextDevice.h  
  107. #ifndef TEXTDEVICE_H  
  108. #define TEXTDEVICE_H  
  109. #include <QThread> 
  110. #include <QString> 
  111. #include <QMutex> 
  112. class TextDevice : public QThread {  
  113.     Q_OBJECT  
  114. public:  
  115.     TextDevice();  
  116.     void run();  
  117.     void stop();  
  118. public slots:  
  119.     void write(const QString& text);  
  120. private:  
  121.     int m_count;  
  122.     QMutex m_mutex;  
  123. };  
  124. #endif // TEXTDEVICE_H  
  125.  
  126.  
  127. //TextDevice.cpp  
  128. #include <QMutexLocker> 
  129. #include <QDebug> 
  130. #include <QString> 
  131. #include "TextDevice.h"  
  132. TextDevice::TextDevice() {  
  133.     m_count = 0;  
  134. }  
  135. void TextDevice::run() {  
  136.     exec();  
  137. }  
  138. void TextDevice::stop() {  
  139.     quit();  
  140. }  
  141. void TextDevice::write(const QString& text) {  
  142.     QMutexLocker locker(&m_mutex);  
  143.     qDebug() << QString("Call %1: %2").arg(m_count++).arg(text);  
  144. }  
  145.  
  146. //TextThread.h  
  147. #ifndef TEXTTHREAD_H  
  148. #define TEXTTHREAD_H  
  149. #include <QThread> 
  150. #include <QString> 
  151. class TextThread : public QThread {  
  152.     Q_OBJECT  
  153. public:  
  154.     TextThread(const QString& text);  
  155.     void run();  
  156.     void stop();  
  157. signals:  
  158.     void writeText(const QString&);  
  159. private:  
  160.     QString m_text;  
  161.     bool m_stop;  
  162. };  
  163. #endif // TEXTTHREAD_H  
  164.  
  165. //TextThread.cpp  
  166. #include "TextThread.h"  
  167. TextThread::TextThread(const QString& text) : QThread() {  
  168.     m_text = text;  
  169.     m_stop = false;  
  170. }  
  171. void TextThread::stop() {  
  172.     m_stop = true;  
  173. }  
  174. void TextThread::run() {  
  175.     while(!m_stop) {  
  176.         emit writeText(m_text);  
  177.         sleep(1);  
  178.     }  
  179. }  
  180.  
  181. //main.cpp  
  182. #include <QApplication> 
  183. #include <QMessageBox> 
  184. #include "TextDevice.h"  
  185. #include "TextThread.h"  
  186. int main(int argc, char** argv) {  
  187.     QApplication app(argc, argv);  
  188.     //啟動線程  
  189.     TextDevice device;  
  190.     TextThread foo("foo"), bar("bar");  
  191.     //把兩個線程使用signal/slot連接起來  
  192.     QObject::connect(&foo, SIGNAL(writeText(const QString&)), &device, SLOT(write(const QString&)));  
  193.     QObject::connect(&bar, SIGNAL(writeText(const QString&)), &device, SLOT(write(const QString&)));  
  194.     //啟動線程  
  195.     foo.start();  
  196.     bar.start();  
  197.     device.start();  
  198.     QMessageBox::information(0, "Threading", "Close me to stop.");  
  199.     //停止線程  
  200.     foo.stop();  
  201.     bar.stop();  
  202.     device.stop();  
  203.     //等待線程結束  
  204.     device.wait();  
  205.     foo.wait();  
  206.     bar.wait();  
  207.     return 0;  

#p#

上面例子代碼可以看出兩個線程之間傳送了類型為QString的信息。像QString等這些QT本身定義的類型,直接傳送即可。但如果是自己定義的類型如果想使用signal/slot來傳遞的話,則沒有這么簡單。直接使用的話,會產生下面這種錯誤:

  1. QObject::connect: Cannot queue arguments of type 'TextAndNumber' (Make sure 'TextAndNumber' is registed using qRegisterMetaType().) 

原因:當一個signal被放到隊列中(queued)時,它的參數(arguments)也會被一起一起放到隊列中(queued起來),這就意味著參數在被傳送到slot之前需要被拷貝、存儲在隊列中(queue)中;為了能夠在隊列中存儲這些參數(argument),Qt需要去construct、destruct、copy這些對象,而為了讓Qt知道怎樣去作這些事情,參數的類型需要使用qRegisterMetaType來注冊(如錯誤提示中的說明)

步驟:(以自定義TextAndNumber類型為例)

自定一種類型,在這個類型的頂部包含:#include <QMetaType>

在類型定義完成后,加入聲明:Q_DECLARE_METATYPE(TextAndNumber);

在main()函數中注冊這種類型:qRegisterMetaType<TextAndNumber>("TextAndNumber");

如果還希望使用這種類型的引用,可同樣要注冊:qRegisterMetaType<TextAndNumber>("TextAndNumber&");

  1. view plaincopy to clipboardprint?  
  2. //TextAndNumber.h     
  3. #ifndef TEXTANDNUMBER_H     
  4. #define TEXTANDNUMBER_H     
  5. #include <QMetaType>     
  6. //必須包含QMetaType,否則會出現下面錯誤:     
  7. //error: expected constructor, destructor, or type conversion before ‘;’ token     
  8. #include <QString>     
  9. class TextAndNumber {     
  10. public:     
  11.     TextAndNumber();     
  12.     TextAndNumber(int, QString);     
  13.     int count();     
  14.     QString text();     
  15. private:     
  16.     int m_count;     
  17.     QString m_text;     
  18. };     
  19. Q_DECLARE_METATYPE(TextAndNumber);     
  20. #endif // TEXTANDNUMBER_H     
  21.     
  22. //TextAndNumber.cpp     
  23. #include "TextAndNumber.h"     
  24. TextAndNumber::TextAndNumber() {     
  25. }     
  26. TextAndNumber::TextAndNumber(int count, QString text) {     
  27.     m_count = count;     
  28.     m_text = text;     
  29. }     
  30. int TextAndNumber::count() {     
  31.     return m_count;     
  32. }     
  33. QString TextAndNumber::text() {     
  34.     return m_text;     
  35. }     
  36.     
  37. //TextDevice.h     
  38. #ifndef TEXTDEVICE_H     
  39. #define TEXTDEVICE_H     
  40. #include <QThread>     
  41. #include <QDebug>     
  42. #include <QString>     
  43. #include "TextAndNumber.h"     
  44. class TextDevice : public QThread {     
  45.     Q_OBJECT     
  46. public:     
  47.     TextDevice();     
  48.     void run();     
  49.     void stop();     
  50. public slots:     
  51.     void write(TextAndNumber& tran);     
  52. private:     
  53.     int m_count;     
  54. };     
  55. #endif // TEXTDEVICE_H     
  56.     
  57. //TextDevice.cpp     
  58. #include "TextDevice.h"     
  59. TextDevice::TextDevice() : QThread() {     
  60.     m_count = 0;     
  61. }     
  62. void TextDevice::run() {     
  63.     exec();     
  64. }     
  65. void TextDevice::stop() {     
  66.     quit();     
  67. }     
  68. void TextDevice::write(TextAndNumber& tran) {     
  69.     qDebug() << QString("Call %1 (%3): %2").arg(m_count++).arg(tran.text()).arg(tran.count());     
  70. }     
  71.     
  72. //TextThread.h     
  73. #ifndef TEXTTHREAD_H     
  74. #define TEXTTHREAD_H     
  75. #include <QThread>     
  76. #include <QString>     
  77. #include "TextAndNumber.h"     
  78. class TextThread : public QThread {     
  79.     Q_OBJECT     
  80. public:     
  81.     TextThread(const QString& text);     
  82.     void run();     
  83.     void stop();     
  84. signals:     
  85.     void writeText(TextAndNumber& tran);     
  86. private:     
  87.     QString m_text;     
  88.     int m_count;     
  89.     bool m_stop;     
  90. };     
  91.     
  92. #endif // TEXTTHREAD_H     
  93.     
  94. //TextThread.cpp     
  95. #include "TextThread.h"     
  96. TextThread::TextThread(const QString& text) : QThread() {     
  97.     m_text = text;     
  98.     m_stop = false;     
  99.     m_count = 0;     
  100. }     
  101. void TextThread::run() {     
  102.     while(!m_stop) {     
  103.         TextAndNumber tn(m_count++, m_text);     
  104.         emit writeText(tn);     
  105.         sleep(1);     
  106.     }     
  107. }     
  108. void TextThread::stop() {     
  109.     m_stop = true;     
  110. }     
  111.     
  112. //main.cpp     
  113. #include <QApplication>     
  114. #include <QMessageBox>     
  115. #include "TextThread.h"     
  116. #include "TextDevice.h"     
  117. #include "TextAndNumber.h"     
  118. int main(int argc, char *argv[])     
  119. {     
  120.     QApplication app(argc, argv);     
  121.     qRegisterMetaType<TextAndNumber>("TextAndNumber");     
  122.     qRegisterMetaType<TextAndNumber>("TextAndNumber&");     
  123.     TextDevice device;     
  124.     TextThread foo("foo"), bar("bar");     
  125.     QObject::connect(&foo, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));     
  126.     QObject::connect(&bar, SIGNAL(writeText(TextAndNumber&)), &device, SLOT(write(TextAndNumber&)));     
  127.     device.start();     
  128.     foo.start();     
  129.     bar.start();     
  130.     QMessageBox::information(0, "Threading", "Click me to close");     
  131.     foo.stop();     
  132.     bar.stop();     
  133.     device.stop();     
  134.     foo.wait();     
  135.     bar.wait();     
  136.     device.wait();     
  137.     qDebug() << "Application end.";     
  138.     return 0;     
  139. }   

小結:詳解 Qt 線程共享數據的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2020-12-14 08:43:56

線程進程資源

2011-07-01 13:03:32

QT 線程 串口

2023-10-26 08:16:20

C++線程

2025-01-07 12:58:28

2011-06-22 17:09:50

QT 進程 通信

2011-06-23 18:37:02

Qt 數據庫

2011-06-30 18:03:58

QT 多線程 服務器

2017-02-16 08:13:17

2020-08-10 08:28:19

ZeroMQCPython

2010-03-16 15:32:26

2011-07-01 14:06:57

Qt sqlite

2011-07-05 09:54:04

2018-01-12 14:35:00

Linux進程共享內存

2011-08-30 14:25:06

QT數據庫

2011-06-24 10:05:51

QT 對象 父對象

2011-06-22 10:12:08

Qt 線程

2011-06-20 17:33:58

Qt MeegoTouch Maemo

2011-06-28 15:01:01

Qt PIMPL

2011-07-01 10:35:20

QT 多線程 TCP

2021-03-05 07:38:52

C++線程編程開發技術
點贊
收藏

51CTO技術棧公眾號

www.欧美色图| 亚洲精品第一国产综合野| 久久99国产精品自在自在app| 91国内视频| 在线日韩电影| 久久久久久久久久久人体| 日本在线免费| 中文字幕一区二区三区乱码在线 | 91亚洲成人| 亚洲欧美日韩国产成人| 成人xxxx| 久久一区二区三区四区| 日韩精品一区二区三区外面| 狠狠色狠狠色综合婷婷tag| 国产亚洲欧洲在线| 久久久久久久久免费视频| 中文字幕乱码日本亚洲一区二区| 五月天久久综合网| 永久亚洲成a人片777777| www欧美日韩| 不卡精品视频| 国产精品久久久久一区| 欧美精品一区在线| 成人h动漫精品一区二区器材| 久久久久久久久久久久久女国产乱| 精品成人在线观看| 男人艹女人在线观看| 香蕉av一区二区| 亚洲国产高清福利视频| 日韩五码在线观看| 成人免费一区二区三区牛牛| 国产乱一区二区| 日韩精品免费在线| 日韩视频在线一区| 成人免费视频观看视频| 亚洲一区在线免费| 在线观看h网| 成人3d动漫一区二区三区91| 青青草手机在线| 综合欧美亚洲日本| 亚洲爆乳无码专区| 91网站在线观看视频| 99视频精品全部免费看| 激情久久久久久久久久久久久久久久| 日韩精品一区二区三区丰满| 日韩国产精品久久| 亚洲国产精品视频一区| 理论电影国产精品| 久久久久亚洲av无码专区喷水| 久久精品久久精品| 色哟哟免费网站| 菠萝蜜视频在线观看一区| 欧美色图色综合| 中文字幕二三区不卡| 国产高潮av| 午夜av区久久| 国产调教视频在线观看| 精品视频久久久久久久| 国产成人精品一区二区三区在线| 久久国产精品亚洲| 精品少妇3p| 91免费在线观看网站| 久久久久久久尹人综合网亚洲| 男女激烈动态图| 国产午夜精品一区二区三区四区| 国产午夜在线| 在线成人午夜影院| 另类激情视频| 欧美最猛性xxxx| 日韩午夜在线| 欧洲精品一区二区三区久久| 日韩美女视频一区| yourporn在线观看中文站| 日韩av在线免费看| 丁香一区二区| 国产一级精品aaaaa看| 国产激情视频一区二区三区欧美 | 91成人综合网| 国产精品福利av| 天天在线视频色| 在线国产精品播放| 国产欧美日韩免费观看| 国产精品18毛片一区二区| 精品一二三四在线| 久久婷五月综合| 91麻豆精品国产| 欧美激情1区2区| 国产精品传媒视频| 丁香婷婷在线观看| 亚洲欧美中文字幕| 欧美三级一区二区| 在线观看视频网站你懂得| 国产农村妇女毛片精品久久麻豆| 国产一区在线观| 亚州一区二区| 日韩一级免费观看| 男人插女人下面免费视频| 国产精品久久福利| 老鸭窝av在线| 国产精品久久久久久一区二区三区| 国产精品免费在线播放| 国产探花一区二区| 都市激情久久久久久久久久久| 色图在线观看| 欧美在线观看视频一区二区三区| 国产一级在线观看| 6080国产精品一区二区| 伊人福利在线| 免费成人高清视频| 91九色国产在线播放| 欧美不卡视频一区| 日本三级视频在线观看| 美日韩精品免费视频| 日韩性xxx| 中文字幕av一区二区| 多野结衣av一区| 国产一区二区三区三区在线观看| 成人三级黄色免费网站| 色婷婷精品久久二区二区蜜臀av| 黄色在线网站| 精品在线小视频| 中文字幕av一区二区三区人| 国产精品免费一区二区三区观看| 亚洲另类在线制服丝袜| 一区二区黄色| 国产高清视频色在线www| 国产在线资源一区| 亚洲一区二区欧美激情| 亚洲成人一区在线观看| 神马欧美一区二区| 在线观看精品国产视频| 国模大尺度一区二区三区| www.久久| 久久亚裔精品欧美| **性色生活片久久毛片| 欧美a级片视频| jvid一区二区三区| 成年人视频在线免费| 国产成人精品久久二区二区91| 91美女福利视频| 久久国产精品亚洲人一区二区三区| 四虎影视在线观看2413| 日韩欧美国产综合在线| 国产精品网站入口| 青青久草在线| 久久久久久久久网站| 国产一区二区在线观看免费| 麻豆传媒在线完整视频| 99中文视频在线| 色婷婷激情久久| 欧美日韩国产综合网| 免费一级毛片在线观看| 91久久精品久久国产性色也91| 亚洲成人免费影院| 久久中文字幕av一区二区不卡| 性欧美16一18| 91精品美女在线| 色呦呦国产精品| 极品中文字幕一区| 久草资源在线观看| 日韩久久久久久久| 精品第一国产综合精品aⅴ| 日本va欧美va瓶| free性护士videos欧美| 亚洲最大免费| 亚洲精品色婷婷福利天堂| 国产综合色在线| 欧美男女交配| 国产91在线免费| 欧美日韩国产二区| 亚洲欧洲色图综合| 日本a口亚洲| 亚洲第一视频| 国产成人亚洲欧美| 日韩免费高清视频| 国产麻豆成人精品| 麻豆视频久久| 五月天最新网址| av一区二区三区四区电影| 欧美美女直播网站| 久久国产精品第一页| 国产成人77亚洲精品www| 欧美两根一起进3p做受视频| 欧美专区福利在线| 欧美视频完全免费看| 久久99久久久欧美国产| 成人国产精品久久| 国产女呦网站| 国产精品日本一区二区| 亚洲第一页中文字幕| 2024国产精品| 波多野结衣在线观看一区二区| av资源在线观看免费高清| 爱爱爱视频网站| 欧美黑人xxxx| 在线欧美日韩国产| 粉嫩一区二区三区性色av| 激情婷婷综合| 国产美女一区视频| 国产a级一级片|