• <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>

            zhonghua

            C++博客 首頁(yè) 新隨筆 聯(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。帖子是英文的,由于英文水平有限,加上他所說(shuō)的使用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ù)說(shuō)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í)行。而那篇文章所說(shuō)的就是大多數(shù)對(duì)這個(gè)函數(shù)產(chǎn)生了誤解,人們總是在派生的QThread的類的構(gòu)造函數(shù)里面調(diào)用moveToThread(this)以希望把該類的所有函數(shù)都在該線程里面執(zhí)行。這樣是錯(cuò)誤的。

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

            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. }  

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

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

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

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

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

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

            posted on 2013-12-11 17:08 米米 閱讀(884) 評(píng)論(0)  編輯 收藏 引用 所屬分類: qt
            蜜臀av性久久久久蜜臀aⅴ麻豆| 久久久久久久综合狠狠综合| 亚洲va久久久久| 国内精品九九久久精品| .精品久久久麻豆国产精品| 色偷偷久久一区二区三区| 国内精品久久久久影院优| 国产精品欧美亚洲韩国日本久久| 久久精品18| 99国产精品久久| 狠狠色丁香婷婷久久综合| 777米奇久久最新地址| 久久久SS麻豆欧美国产日韩| 国内精品久久久久影院优| 精品久久久无码人妻中文字幕| 四虎国产永久免费久久| 国产情侣久久久久aⅴ免费| 一本久久精品一区二区| 亚洲精品国产成人99久久| 久久久久亚洲av成人无码电影| 区久久AAA片69亚洲| 久久精品无码一区二区三区免费| 国产亚洲美女精品久久久久狼| 99精品久久久久久久婷婷| 国产成年无码久久久免费| 亚洲国产成人久久综合一区77| 久久97久久97精品免视看秋霞| 99国产欧美久久久精品蜜芽 | 久久丝袜精品中文字幕| 久久国产乱子伦精品免费强| 久久国产精品一区| 国产亚洲精久久久久久无码77777| 性做久久久久久免费观看| 婷婷伊人久久大香线蕉AV| 精品久久久久久综合日本| 久久久精品日本一区二区三区| 久久综合伊人77777麻豆| 久久午夜无码鲁丝片| 伊人久久国产免费观看视频| 浪潮AV色综合久久天堂| 久久亚洲日韩看片无码|