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

隨筆-1  評論-10  文章-0  trackbacks-0

第一回 Signal和Slot是同步的還是異步的?

  我們知道Qt以他的signal和slot機制獨步天下。但大家在用的時候有沒有注意過,signal和slot之間是異步的,還是同步的呢?為此我問過不少使用Qt的道友。有人說是同步的,有人說是異步的,也有人說要看當時你的人品。:( #$%^&*

  為此貧道,特別做了以下幾個測試:

     First,在main()主函數(shù)里,設(shè)置兩個基于QObject為父類的對象a和b,a觸發(fā)signal,b接受signal。請看具體案例:

    

 1 class MyTestA : public QObject
2 {
3 Q_OBJECT
4 public:
5 void emitSignal()
6 {
7 signalMyTestA();
8 }
9
10 public slots:
11 void slotMyTestA()
12 {
13 qDebug()<<"slotMyTestA is called.";
14 }
15 signals:
16 void signalMyTestA();
17 };
18
19 class MyTestB : public QObject
20 {
21 Q_OBJECT
22 public slots:
23 void slotMyTestB()
24 {
25 qDebug()<<"slotMyTestB is called.";
26 }
27 signals:
28 void signalMyTestB();
29 };
30
31 int main(int argc, char *argv[])
32 {
33 QApplication app(argc, argv);
34
35 MyTestA a;
36 MyTestB b;
37 QObject::connect(&a,SIGNAL(signalMyTestA()),&b,SLOT(slotMyTestB()));
38
39 a.emitSignal();
40
41 return app.exec();
42 }

在slotMyTestB的函數(shù)里打個斷點,看一下調(diào)用堆棧(call stack)。

是同步調(diào)用的,某些道友開始拈胡微笑,實踐出真知啊。

此時只見東方黑云滾滾,電閃雷鳴,又有道友開始度劫了。突然一度劫道友橫眉冷對,拿起拂塵刷刷的改寫了上面的代碼。只見此道友把a對象挪到了一個新線程中(MyTestC創(chuàng)建的),而b對象仍然在主線程中。然后a對象觸發(fā)信號。

class MyTestA : public QObject
{
    Q_OBJECT
public:
    void emitSignal()
    {
        signalMyTestA();
    }
public slots:
    void slotMyTestA()
    {
        qDebug()<<"slotMyTestA is called.";
    }
signals:
    void signalMyTestA();
};
class MyTestB : public QObject
{
    Q_OBJECT
public slots:
    void slotMyTestB()
    {
        qDebug()<<"slotMyTestB is called.";
    }
signals:
    void signalMyTestB();
};
extern MyTestB *g_pMyTestB;
class MyTestC : public QThread
{
    Q_OBJECT
public:
    void run()
    {
        MyTestA a;
        connect(&a,SIGNAL(signalMyTestA()),g_pMyTestB,SLOT(slotMyTestB()));
        a.emitSignal();
        exec();
    }
public slots:
    void slotMyTestC()
    {
        qDebug()<<"slotMyTestC is called.";
    }
signals:
    void signalMyTestC();
};
class MyTest : public QDialog
{
    Q_OBJECT
public:
    MyTest(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MyTest();
private:
    Ui::MyTestClass ui;
};
////////////////////////////////////////////////
MyTestB *g_pMyTestB = NULL;
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyTestB b;
    g_pMyTestB = &b;
    MyTestC c;
    c.start();
    return app.exec();
}

說時遲,那時快。在一道紫雷劈下之際,按下了F5。只見,此時的調(diào)用堆棧顯示,

奇跡出現(xiàn)了,居然變成異步調(diào)用了。只見東方天空萬道金光射下,在陣陣仙樂聲中,傳來朗朗之聲:"貧道塵事已了,再無牽掛"。

難道Qt真的是靠人品的,或者Qt莫不是也是修仙道友,不日也將飛升。

在吾等眾人膜拜加疑惑之時,只見飛升前輩,留下一條偈語。內(nèi)事不決問百度,外事不決問谷歌。

吾等眾人立刻搜尋,恍然大物。

原來signal和slot是異步調(diào)用還是同步調(diào)用,取決于對connect的設(shè)定。其實connect還有一個參數(shù)(Qt::ConnectionType),是它決定了是同步還是異步。以下是ConnectionType的定義

只不過,平常它有一個默認值Qt::AutoConnection,我們忽略了它。這時有道友問道,為何在AutoConnection模式下,有時是同步,有時是異步,莫非Auto就是人品代名詞。

非也,其實Auto是這樣規(guī)定的,

當sender和receiver在同一線程時,就是同步模式,而在不同線程時,則是異步模式。

眾人皆曰善。

就在眾人彈冠相慶之時,突然一道類似眼鏡發(fā)出的寒光閃過,一個黑影漸漸清晰了起來。

他居然就是..................

青春永駐,十二年如一日的柯南君,他招牌式的磁性聲音給眾道友一晴天霹靂,“諸位以為這就是全部的真相嗎?”

接著他刷刷的又改寫了代碼,在主線程中生成a,b兩個對象,而a對象在新線程(MyTestC創(chuàng)建的)中觸發(fā)信號。

 

class MyTestA : public QObject
{
    Q_OBJECT
public:
    void emitSignal()
    {
        signalMyTestA();
    }
public slots:
    void slotMyTestA()
    {
        qDebug()<<"slotMyTestA is called.";
    }
signals:
    void signalMyTestA();
};
class MyTestB : public QObject
{
    Q_OBJECT
public slots:
    void slotMyTestB()
    {
        qDebug()<<"slotMyTestB is called.";
    }
signals:
    void signalMyTestB();
};
extern MyTestB *g_pMyTestB;
extern MyTestA *g_pMyTestA;
class MyTestC : public QThread
{
    Q_OBJECT
public:
    void run()
    {
        g_pMyTestA->emitSignal();
        exec();
    }
public slots:
    void slotMyTestC()
    {
        qDebug()<<"slotMyTestC is called.";
    }
signals:
    void signalMyTestC();
};
/////////////////////////////////////////////
MyTestB *g_pMyTestB = NULL;
MyTestA *g_pMyTestA = NULL;
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyTestA a;
    g_pMyTestA = &a;
    MyTestB b;
    g_pMyTestB = &b;
    QObject::connect(&a,SIGNAL(signalMyTestA()),&b,SLOT(slotMyTestB()));
    MyTestC c;
    c.start();
    return app.exec();
}

 

在眾人疑惑的眼光中,此君淡定的按下了F5。只見調(diào)用堆棧(call stack)顯示

眾人皆驚呼,“Impossible”。a和b明明是屬于一個線程的,為何會異步調(diào)用。此時我們熟悉的語錄,又在耳邊回響,是"我相信真相只有一個!!!"這句話嗎?No,只見柯南君,優(yōu)雅地揮了揮手指,"Nothing impossible",從口中緩緩滑出。

。眾人皆撲街,“有屁快放”。

此時柯南君緩緩從口袋中,摸出一張紙,拋向空中,然后轉(zhuǎn)身離去。只見隨風飄落的紙面上面摘錄了這么一段Qt源代碼,在Auto模式下,如果要同步調(diào)用,不僅要求sender和receiver是同一線程,而且sender觸發(fā)的時候,所在的線程也要和receiver一致。

 // determine if this connection should be sent immediately or
            // put into the event queue
            if ((c->connectionType == Qt::AutoConnection
                 && (currentThreadData != sender->d_func()->threadData
                     || receiver->d_func()->threadData != sender->d_func()->threadData))
                || (c->connectionType == Qt::QueuedConnection)) {
                queued_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
                continue;
            } else if (c->connectionType == Qt::BlockingQueuedConnection) {
                blocking_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
                continue;
            }

摘自qobject.cpp

z眾人皆驚,原來在Auto模式下,如果sender的觸發(fā)時所處的線程和receiver不同,也會是異步調(diào)用。此時道友齊聲向柯南喊道“這是全部的真相了嗎”?柯南轉(zhuǎn)過頭來笑而不語,漸漸又消失在黑暗中。“有多少無恥可以重來”漂上了眾人的心頭。望著遠處的雨后陽光,一個大大的問號也出現(xiàn)在眾人頭頂,"Qt你到底有多無恥???"。眾人又陷入了沉思。

欲知后事如何,請聽下回分解。

 

此篇已在CNBLOG同時發(fā)布

 

 

 

 

 

 




posted on 2011-08-26 10:41 櫻桃小錘子 閱讀(13006) 評論(10)  編輯 收藏 引用

評論:
# re: Qt那點事兒(一) 2011-08-26 12:25 | 飯中淹
磁性的柯南。。。看著他變小的長大的我們這一代。  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-26 13:35 | tinyms
Sign是異步的,slot是同步的,前者是消息,后者僅僅是回調(diào)  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-26 14:27 | 櫻桃小錘子
@tinyms
Sign是異步的,slot是同步的>>何解,請賜教
  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-26 15:23 | 他她女鞋
感覺還是挺繁雜的。  回復  更多評論
  
# re: Qt那點事兒(一)[未登錄] 2011-08-26 17:20 | cc
我弟,你敢說的簡單點嗎  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-28 14:12 | mos
搞這么復雜,真不如boost::signal  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-29 09:45 | zuhd
哥 你的文筆太有愛了 不懂qt
我是來看小說的  回復  更多評論
  
# re: Qt那點事兒(一)[未登錄] 2011-08-29 11:19 | 姚冬
如果比較下常用的幾種 signal/slot實現(xiàn)的話,我覺得Qt的實現(xiàn)是最好的。

boost的signal/slot 有一個很嚴重的問題,就是會導致編譯非常慢,你寫個小測試程序是不會感覺到的,如果在幾十個文件中使用的話,編譯時間會成倍增長,即使用并行編譯也是慢。都是模板搞的,boost的泛型用得太花哨了。

Qt則完全沒有這個問題,而且執(zhí)行效率也還可以。  回復  更多評論
  
# re: Qt那點事兒(一) 2011-08-30 13:52 | uestc001@163.com
文筆不錯  回復  更多評論
  
# re: Qt那點事兒(一) 2011-11-07 21:54 | 渡劫導游
某學過半個月Qt的導游落果  回復  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久综合网天天| 亚洲乱码视频| 国产精品久久中文| 欧美国产日韩在线| 国产精品日日摸夜夜摸av| 亚洲黄色高清| 国产精品一区二区男女羞羞无遮挡| 欧美成人dvd在线视频| 狠狠色综合日日| 亚洲综合欧美日韩| 宅男噜噜噜66国产日韩在线观看| 久久这里有精品视频| 久久视频在线看| 国产一区二区在线观看免费| 亚洲特色特黄| 亚洲一二三区在线| 亚洲国产毛片完整版| 久久精品二区亚洲w码| 欧美v日韩v国产v| 亚洲精品中文字幕在线| 欧美国产国产综合| 亚洲精品国产精品久久清纯直播| 亚洲国产毛片完整版| 欧美成人在线影院| 一区二区电影免费观看| 亚洲欧美日韩在线| 国产一区自拍视频| 欧美福利影院| 中国成人亚色综合网站| 久久成人国产精品| 亚洲国产一区在线观看| 国产精品www.| 久久婷婷蜜乳一本欲蜜臀| 亚洲激情视频网| 亚洲女同在线| 在线观看精品视频| 欧美日韩在线三区| 国产精品99久久久久久人| 性做久久久久久免费观看欧美| 久久中文精品| 亚洲欧美日韩国产一区二区三区| 激情视频亚洲| 国产精品青草久久| 蜜臀av一级做a爰片久久| 99re亚洲国产精品| 欧美成人在线免费视频| 欧美一区国产二区| 亚洲香蕉成视频在线观看 | 国产主播精品| 欧美日韩在线播放三区四区| 久久国产精品一区二区| 亚洲国产成人porn| 久久久亚洲影院你懂的| 亚洲综合首页| 亚洲一区美女视频在线观看免费| 精品96久久久久久中文字幕无| 国产精品久久网| 欧美亚洲成人网| 欧美日韩三区| 欧美人成免费网站| 一区二区免费在线观看| 国产婷婷色一区二区三区| 欧美日韩在线不卡一区| 久久久久久久久久久久久9999| 欧美亚洲尤物久久| 亚洲影视九九影院在线观看| 一本久久综合亚洲鲁鲁五月天| 蜜臀久久久99精品久久久久久| 久久久999国产| 免费视频亚洲| 亚洲欧美一区二区三区久久| 亚洲视频一区二区在线观看| 一本色道久久综合一区| 亚洲一区不卡| 午夜精品在线| 久久综合久久综合这里只有精品| 欧美一区二区三区啪啪| 卡一卡二国产精品| 亚洲国产高潮在线观看| aa国产精品| 欧美一区二区精品在线| 久久久久久久尹人综合网亚洲 | 国产精品sm| 狠狠狠色丁香婷婷综合激情| 在线观看精品一区| 亚洲一级在线观看| 裸体素人女欧美日韩| 最新国产の精品合集bt伙计| 99国产精品久久| 久久精品国产v日韩v亚洲| 欧美中文日韩| 99re热这里只有精品免费视频| 一区二区三区欧美日韩| 久久精品网址| 亚洲精品在线观| 久久精品欧洲| 国产精品国色综合久久| 亚洲国产你懂的| 久久狠狠亚洲综合| 日韩西西人体444www| 久久精品一区二区三区四区| 欧美日韩一区高清| 亚洲毛片在线| 欧美国产亚洲精品久久久8v| 欧美一区二区三区婷婷月色| 国产女人精品视频| 一区二区亚洲| 久久蜜桃资源一区二区老牛 | 欧美第一黄色网| 亚洲欧美日韩在线观看a三区 | 亚洲午夜在线观看| 亚洲国产精品va在线看黑人| 性一交一乱一区二区洋洋av| 欧美日韩亚洲视频一区| 亚洲国产欧美精品| 欧美成人xxx| 欧美激情精品久久久久久免费印度 | 久久久久久有精品国产| 国语自产在线不卡| 欧美11—12娇小xxxx| 欧美人与性动交a欧美精品| 亚洲天堂av在线免费观看| 亚洲精品社区| 国产一区av在线| 六月婷婷一区| 欧美日韩免费观看一区=区三区| 一区二区三区久久| 亚洲欧美综合精品久久成人| 亚洲大胆在线| 日韩亚洲一区二区| 国内精品久久久久影院色 | 老色鬼久久亚洲一区二区| 亚洲最新在线视频| 免费成人性网站| 麻豆成人精品| 国产精品一区二区黑丝| 亚洲国产成人不卡| 国产伦精品一区二区三区免费迷| 欧美国产在线电影| 国产日产亚洲精品| 国产精品黄色| 在线亚洲伦理| 六十路精品视频| 久久99在线观看| 欧美日韩国产综合在线| 欧美sm极限捆绑bd| 国产手机视频精品| 中文网丁香综合网| 日韩系列在线| 免费欧美在线视频| 亚洲电影免费观看高清完整版| 欧美日韩免费| 99re66热这里只有精品4| 亚洲日本理论电影| 欧美a一区二区| 亚洲电影成人| 日韩亚洲欧美在线观看| 蜜桃伊人久久| 亚洲风情在线资源站| 国产一区二区在线观看免费播放| 亚洲一区二区三区视频播放| 99综合在线| 国产精品v欧美精品v日韩精品| 一本色道精品久久一区二区三区| 在线视频中文亚洲| 国产精品久久久久久久午夜| 亚洲图片你懂的| 久久av一区二区三区亚洲| 国产欧美日韩不卡| 久久精品国产免费| 亚洲第一福利在线观看| 日韩午夜激情| 国产精品素人视频| 免费一区视频| 午夜视频精品| 老牛国产精品一区的观看方式| 久久久久网址| 亚洲夜间福利| 狠狠操狠狠色综合网| 久久人人爽国产| 久久男人资源视频| 永久免费精品影视网站| 免费不卡在线视频| 亚洲精品中文字幕有码专区| 亚洲一区二区3| 国产在线不卡视频| 欧美成人精品| 亚洲乱码国产乱码精品精天堂| 亚洲精品日本| 欧美国产日韩亚洲一区| 一本色道**综合亚洲精品蜜桃冫 | 国产在线高清精品| 欧美成人日韩| 午夜精品久久久久久久蜜桃app | 久久久久久久尹人综合网亚洲| 最新精品在线| 国产中文一区二区| 国产精品久久久久久av福利软件 | 久久久www成人免费毛片麻豆| 在线观看亚洲精品视频|