青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zhonghua

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

        昨晚在一個(gè)郵件列表里面看見一個(gè)關(guān)于在線程種使用signal/slot的討論,由于回復(fù)太多,這里就不貼出原文了。

        主要是關(guān)于怎樣從一個(gè)線程發(fā)送信號(hào)到另外一個(gè)線程的問題。其實(shí)這個(gè)也不是什么復(fù)雜的問題,在qt的asstant里面已經(jīng)描訴的比較清楚了。當(dāng)我們鏈接信號(hào)的時(shí)候使用qt::queuedConnection就能使slot在它自己的線程里面運(yùn)行。

        另我驚訝的是在其中一個(gè)的回復(fù)種他給出了一些資料,其中一個(gè)名為you‘ar doing it wrong。帖子是英文的,由于英文水平有限,加上他所說的使用QT thread的方式和我們平時(shí)直接派生QThread實(shí)現(xiàn)run函數(shù)的方式不一樣,所以讓我看的非常含糊,甚至到了不清不楚的地步。看了后面的大量的回復(fù)和討論,勉強(qiáng)明白了它的意思。

    具體請(qǐng)看這里
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/

       在那里他提出了一種新的使用QThread的方式,其實(shí)也不算是信了,據(jù)說qt 4.4就已經(jīng)有了。那就是QObject::moveToThread。根據(jù)QT的asstant的描述,moveToThread的作用是把一個(gè)QOject移動(dòng)到一個(gè)線程里面去,那么它到底是什么意思呢。我的理解就是當(dāng)我們調(diào)用QObject的moveToThread方法之后,我們這個(gè)派生自QObject的類的代碼就會(huì)在新的線程里面執(zhí)行。而那篇文章所說的就是大多數(shù)對(duì)這個(gè)函數(shù)產(chǎn)生了誤解,人們總是在派生的QThread的類的構(gòu)造函數(shù)里面調(diào)用moveToThread(this)以希望把該類的所有函數(shù)都在該線程里面執(zhí)行。這樣是錯(cuò)誤的。

         今天為了驗(yàn)證這個(gè)方法到底有什么用,寫了一些代碼來做測試。

1、

   

  1. #include <QObject>  
  2. #include <QDebug>  
  3. #include <QThread>  
  4.   
  5. class MyObject : public QObject {  
  6.     Q_OBJECT  
  7.     public:  
  8.         MyObject() {};  
  9.         ~MyObject() {}  
  10.   
  11.     public slots:  
  12.         void first() {  
  13.             qDebug() << QThread::currentThreadId();  
  14.         }  
  15.         void second() {  
  16.             qDebug() << QThread::currentThreadId();  
  17.         }  
  18.         void three() {  
  19.             qDebug() << QThread::currentThreadId();  
  20.         }  
  21. };  

2、mainwindow.cxx

  1. #include "mainwindow.h"  
  2. #include <QPushButton>  
  3. #include <QVBoxLayout>  
  4. #include "myobject.h"  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {  
  7.     my = new MyObject;  
  8.     firstButton = new QPushButton(tr("first"), 0);  
  9.     connect(firstButton, SIGNAL(clicked()), my, SLOT(first()), Qt::QueuedConnection);  
  10.     secondButton = new QPushButton(tr("second"), 0);  
  11.     connect(secondButton, SIGNAL(clicked()), my, SLOT(second()), Qt::QueuedConnection);  
  12.     threeButton = new QPushButton(tr("three"), 0);  
  13.     connect(threeButton, SIGNAL(clicked()), my, SLOT(three()), Qt::QueuedConnection);  
  14.     selfButton = new QPushButton(tr("self"), 0);  
  15.     connect(selfButton, SIGNAL(clicked()), this, SLOT(onSelfPushed()));  
  16.     exitButton = new QPushButton(tr("exit"), 0);  
  17.     connect(exitButton, SIGNAL(clicked()), this, SLOT(onExitPushed()));  
  18.   
  19.     QVBoxLayout *layout = new QVBoxLayout;  
  20.     layout->addWidget(firstButton);  
  21.     layout->addWidget(secondButton);  
  22.     layout->addWidget(threeButton);  
  23.     layout->addWidget(selfButton);  
  24.     layout->addWidget(exitButton);  
  25.   
  26.     QWidget *p = new QWidget;  
  27.     p->setLayout(layout);  
  28.   
  29.     QThread *thread = new QThread;  
  30.     my->moveToThread(thread);  
  31.   
  32.     thread->start();  
  33.     connect(thread, SIGNAL(started()), my, SLOT(first()));  
  34.   
  35.     setCentralWidget(p);  
  36. }  
  37.   
  38. MainWindow::~MainWindow() {  
  39. }  
  40.   
  41. void MainWindow::onFirstPushed() {  
  42.     my->first();  
  43. }  
  44.   
  45. void MainWindow::onSecondPushed() {  
  46.     my->second();  
  47. }  
  48.   
  49. void MainWindow::onThreePushed() {  
  50.     my->three();  
  51. }  
  52.   
  53. void MainWindow::onSelfPushed() {  
  54.     qDebug() << QThread::currentThreadId();  
  55. }  
  56.   
  57. void MainWindow::onExitPushed() {  
  58.     close();  
  59. }  

    通過測試,在mainwidow.cxx使用上面的代碼的時(shí)候,由于my調(diào)用了movetothread函數(shù),那么它所有的槽函數(shù)都是執(zhí)行在新開辟的線程里面。

   如果去掉moveToThread函數(shù),那么所有的函數(shù)都將執(zhí)行在gui線程里面。

   同時(shí)為了測試connect的第五個(gè)參數(shù),在connect的時(shí)候可以將Qt::QueuedConnection修改為Qt::DirectConnection,這樣所有的槽函數(shù)也將在主線程里面執(zhí)行。

     最后要注意的是,如果上面connect的時(shí)候連接的是this的onXXXXXX槽函數(shù)再來調(diào)用的my的槽函數(shù)的話,那么這些槽函數(shù)也將執(zhí)行在onXXXXX槽函數(shù)所在的線程,這里是主線程。

     通過上面的測試,我們在使用線程的時(shí)候,就可以將一個(gè)類派生自QObject,然后實(shí)現(xiàn)所有的signal/slot,然后通過調(diào)用movetothread函數(shù)來使他們執(zhí)行在新的線程里面,而不是每次都要重新派生QThread,并且派生QThread函數(shù)的另外一個(gè)不好的地方是只有run函數(shù)內(nèi)部的代碼才會(huì)執(zhí)行在新線程里面,相比起來,派生QObject并使用movetothread函數(shù)更具有靈活性。

    最后,把討論中列出的所有的網(wǎng)址列出來哈。

posted on 2013-12-11 17:08 米米 閱讀(898) 評(píng)論(0)  編輯 收藏 引用 所屬分類: qt
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本久久a久久免费精品不卡| 午夜日韩电影| 亚洲东热激情| 新狼窝色av性久久久久久| 亚洲视频精品| 欧美高清在线精品一区| 狂野欧美激情性xxxx欧美| 国产日韩欧美综合| 亚洲砖区区免费| 午夜视频一区二区| 国产精品成人在线观看| 夜夜嗨网站十八久久| 一本色道久久综合狠狠躁篇怎么玩 | 欧美区一区二区三区| 欧美成人69| 亚洲国产91| 久久综合给合| 欧美激情在线有限公司| 亚洲黄色在线看| 欧美大片在线看免费观看| 欧美黄免费看| 99re66热这里只有精品3直播| 欧美成人蜜桃| 亚洲美女一区| 亚洲女爱视频在线| 国产欧美精品日韩区二区麻豆天美| 亚洲图片在线| 久久爱www| 一区二区视频免费在线观看 | 亚洲大胆美女视频| 欧美成人精品三级在线观看 | 亚洲高清一二三区| 亚洲日本一区二区三区| 欧美精品免费看| 亚洲特级片在线| 欧美中文字幕在线播放| 极品尤物av久久免费看| 麻豆av一区二区三区久久| 亚洲国产日韩一区| 亚洲一区三区电影在线观看| 国产九九精品视频| 久久精视频免费在线久久完整在线看 | 99国内精品久久| 国产精品日日做人人爱 | 新67194成人永久网站| 久久躁日日躁aaaaxxxx| 亚洲精品国偷自产在线99热| 欧美日韩卡一卡二| 欧美一区二区精品| 亚洲国产日韩在线| 欧美一二三视频| 亚洲国产欧洲综合997久久| 欧美日韩在线一区二区| 性伦欧美刺激片在线观看| 免费亚洲电影在线| 亚洲女女女同性video| 激情懂色av一区av二区av| 欧美精品一区二区蜜臀亚洲| 亚洲欧美色一区| 最新国产精品拍自在线播放| 欧美一区二区三区免费视| 亚洲国产视频一区二区| 国产精品青草久久| 欧美国产日本高清在线| 性一交一乱一区二区洋洋av| 亚洲激情六月丁香| 老巨人导航500精品| 亚洲综合导航| 日韩午夜激情| 在线看无码的免费网站| 国产欧美精品在线观看| 欧美日本亚洲视频| 蜜臀av国产精品久久久久| 亚洲免费网站| 日韩亚洲欧美一区| 欧美高清免费| 久久久亚洲精品一区二区三区| 夜久久久久久| 91久久夜色精品国产九色| 国产一区美女| 国产精品夜夜夜| 欧美丝袜一区二区| 欧美国产日韩在线观看| 久久精品噜噜噜成人av农村| 亚洲午夜国产成人av电影男同| 亚洲国产午夜| 欧美国产精品| 美女脱光内衣内裤视频久久网站| 久久se精品一区二区| 亚洲午夜精品一区二区| 一区二区三区鲁丝不卡| 亚洲另类一区二区| 亚洲国产精品成人| 一色屋精品亚洲香蕉网站| 国产亚洲一区二区精品| 国产精品日本一区二区| 国产精品成人一区二区三区吃奶| 欧美日韩在线观看一区二区| 欧美国产一区二区在线观看| 免费永久网站黄欧美| 老司机成人在线视频| 久久久另类综合| 久久欧美肥婆一二区| 久久精品夜色噜噜亚洲aⅴ| 欧美中文字幕在线| 欧美在线观看天堂一区二区三区| 篠田优中文在线播放第一区| 香蕉av777xxx色综合一区| 欧美一二区视频| 久久av一区| 久久久久五月天| 免费h精品视频在线播放| 蜜桃av一区二区三区| 欧美刺激性大交免费视频 | 欧美成人精品h版在线观看| 免费在线视频一区| 欧美极品一区二区三区| 欧美日韩精品一本二本三本| 欧美三级不卡| 国产精品欧美久久| 国产亚洲精品久久久| 在线观看精品视频| 99精品欧美一区| 亚洲一二区在线| 久久久久久综合| 欧美高清视频在线观看| 亚洲精品在线二区| 亚洲一区二区免费在线| 久久久久久久尹人综合网亚洲| 免费亚洲网站| 国产精品激情偷乱一区二区∴| 国产视频一区二区在线观看| 亚洲国产日韩欧美在线图片| 亚洲视频axxx| 久久综合中文字幕| 99精品国产在热久久| 欧美一区二区视频在线观看2020| 久久亚洲高清| 国产精品成人一区二区| 在线成人激情视频| 亚洲性夜色噜噜噜7777| 噜噜噜91成人网| 一级日韩一区在线观看| 久久精品免费看| 欧美性大战久久久久久久蜜臀| 国产伦精品一区二区三区照片91 | 这里只有精品丝袜| 久久综合久久久久88| 日韩午夜在线电影| 久久精品成人欧美大片古装| 欧美精品一区二区精品网| 国产一区二区三区久久| 夜夜爽99久久国产综合精品女不卡| 久久激情网站| 日韩一级精品视频在线观看| 久久久av网站| 国产精品人人做人人爽| 999亚洲国产精| 蜜臀av国产精品久久久久| 亚洲一区二区三区视频| 欧美激情国产高清| 在线观看av一区| 欧美一区二区三区在线观看视频| 亚洲经典在线看| 久久久免费av| 国产婷婷色一区二区三区在线| 在线一区亚洲| 欧美激情亚洲另类| 久久久免费av| 国产一区二区三区视频在线观看| 这里只有精品在线播放| 亚洲欧洲中文日韩久久av乱码| 久久久久网址| 国外成人网址| 久久成人精品电影| 亚洲少妇最新在线视频| 欧美日韩亚洲一区在线观看| 亚洲精品美女在线观看| 欧美黄网免费在线观看| 久久久蜜臀国产一区二区| 韩国成人精品a∨在线观看| 欧美亚洲免费高清在线观看| 亚洲一区二区成人在线观看| 国产精品va在线| 艳妇臀荡乳欲伦亚洲一区| 亚洲国产裸拍裸体视频在线观看乱了| 久久久成人网| 在线免费观看欧美| 欧美成人综合| 欧美成人免费在线观看| 亚洲精品在线免费观看视频| 欧美激情精品久久久久| 蜜臀久久久99精品久久久久久 | 欧美一级专区免费大片| 亚洲淫性视频| 国产中文一区二区三区| 免费成人网www| 欧美电影在线观看| 一区二区三区国产盗摄| 夜夜夜久久久|