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

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)明白了它的意思。

    具體請看這里
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ù)對這個(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>
            久久久亚洲影院你懂的| 亚洲国产天堂久久综合网| 欧美日本一道本在线视频| 亚洲欧美在线免费观看| 亚洲精品视频一区二区三区| 欧美成人午夜77777| 久久久夜精品| 国产精品视频一| 欧美日韩四区| 国产精品二区在线观看| 国产精品美女久久久久久2018| 国产精品v欧美精品v日本精品动漫 | 一本色道久久综合狠狠躁篇的优点| 亚洲人体偷拍| 亚洲欧洲在线一区| 日韩视频―中文字幕| 99国产精品99久久久久久粉嫩| 欧美福利一区二区| 欧美午夜剧场| 国模私拍视频一区| 亚洲黄色在线视频| 在线视频你懂得一区| 欧美亚洲综合另类| 美女视频一区免费观看| 亚洲欧洲精品一区二区三区| 亚洲视频精品在线| 久久久久久亚洲精品中文字幕| 久久久久久久波多野高潮日日 | 国产欧美日韩综合| 在线成人黄色| 日韩一级黄色大片| 欧美综合国产| 亚洲人www| 久久国产精品72免费观看| 另类尿喷潮videofree| 欧美区二区三区| 在线免费观看视频一区| 亚洲欧美国产日韩中文字幕| 欧美激情自拍| 久久精品亚洲精品| 国产精品久久久久一区二区三区共 | 欧美一区二区播放| 免费亚洲一区二区| 国模私拍一区二区三区| 午夜在线成人av| 欧美激情一区| 久久久精品2019中文字幕神马| 欧美日韩久久不卡| 亚洲高清av| 欧美一级播放| 亚洲精品女人| 欧美在线一二三四区| 欧美激情一区三区| 国产日韩欧美| 亚洲欧美国产毛片在线| 亚洲大胆人体视频| 亚洲一区视频在线| 欧美成人国产va精品日本一级| 亚洲毛片一区| 午夜久久99| 一区二区三区免费观看| 蜜桃精品久久久久久久免费影院| 久久午夜影视| 欧美肥婆在线| 国产伦精品一区二区三区免费 | 性伦欧美刺激片在线观看| 欧美一区日本一区韩国一区| 久久综合狠狠| 亚洲影院在线观看| 亚洲伦理自拍| 宅男噜噜噜66国产日韩在线观看| 麻豆久久婷婷| 国产精品麻豆欧美日韩ww| 亚洲黄一区二区三区| 一本色道久久综合亚洲精品不 | 国产亚洲欧美一区二区三区| 亚洲视频一区在线观看| 国产午夜精品美女视频明星a级| 99亚洲伊人久久精品影院红桃| 亚洲一区二区成人在线观看| 麻豆精品视频在线观看| 欧美色欧美亚洲另类七区| 欧美视频你懂的| 亚洲国产一区在线| 亚洲线精品一区二区三区八戒| 欧美激情网友自拍| 午夜日韩福利| 久久久噜噜噜久久久| 久久视频这里只有精品| 国产一区二区三区奇米久涩| 亚洲一区高清| 亚洲国产日韩欧美一区二区三区| 午夜精品福利一区二区三区av | 亚洲免费观看| 久久久人成影片一区二区三区| 国产精品久久久久免费a∨大胸| 99av国产精品欲麻豆| 欧美国产先锋| 欧美欧美天天天天操| 亚洲黑丝在线| 日韩午夜av| 久久在线免费视频| 欧美影视一区| 国产一区视频网站| 欧美一区视频在线| 欧美大片在线观看一区| 午夜在线电影亚洲一区| 国产精品免费网站在线观看| 在线视频你懂得一区二区三区| 亚洲全黄一级网站| 一区二区三区四区五区在线| 国产一区二区0| 亚洲欧美不卡| 亚洲一区中文字幕在线观看| 国产精品毛片| 久久精品国产亚洲a| 久久高清福利视频| 亚洲第一区色| 欧美激情在线有限公司| 欧美www视频在线观看| 亚洲欧洲日韩在线| 亚洲综合激情| 日韩亚洲欧美成人| 欧美日韩在线视频首页| 亚洲欧美日本在线| 久久精品导航| 一本色道久久综合亚洲二区三区| 欧美本精品男人aⅴ天堂| 欧美国产日本在线| 欧美激情在线观看| 99在线精品免费视频九九视| 亚洲手机在线| 黄色亚洲精品| 亚洲品质自拍| 国产精品欧美一区喷水 | 欧美日产在线观看| 亚洲精品日韩精品| 亚洲欧美影院| 国产麻豆精品theporn| 欧美成人高清视频| 欧美日韩中文字幕精品| 久久国产精品99精品国产| 欧美aⅴ99久久黑人专区| 亚洲网友自拍| 久久在线免费观看| 亚洲香蕉伊综合在人在线视看| 欧美在线播放一区| 国产日韩在线播放| 亚洲免费综合| 免播放器亚洲一区| 亚洲一线二线三线久久久| 久久久久国产精品www| 亚洲一区二区黄色| 欧美ed2k| 久久综合九色| 国产精品嫩草久久久久| 亚洲国产另类 国产精品国产免费| 久久久亚洲高清| 国产精品久久| 欧美aⅴ99久久黑人专区| 欧美日韩在线观看视频| 久久久99爱| 欧美视频福利| 亚洲精品之草原avav久久| 久久久美女艺术照精彩视频福利播放 | 亚洲在线成人| 99re8这里有精品热视频免费| 亚洲第一主播视频| 欧美一级电影久久| 亚洲天堂av高清| 欧美另类一区| 欧美激情一区在线| 一区二区三区在线观看国产| 亚洲欧美在线一区二区| 亚洲一区二区三区高清 | 欧美丝袜一区二区三区| 美国成人直播| 影音先锋国产精品| 久久国产精品一区二区| 久久精品国产精品亚洲综合| 欧美午夜精品久久久久久人妖| 亚洲高清视频一区二区| 国产一区亚洲一区| 欧美激情精品久久久久久| 欧美日韩精品久久久| 美女国产一区| 亚洲黄一区二区三区| 欧美成人一区二区三区| 亚洲国内高清视频| 亚洲精品看片| 午夜精品久久久久影视| 亚洲精品欧美极品| 亚洲综合三区| 国产精品性做久久久久久| 亚洲图片欧美日产| 亚洲午夜精品福利| 国产精品影片在线观看| 亚洲手机成人高清视频| 久久精品国产免费| 欧美三级资源在线|