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

隨筆-1  評(píng)論-10  文章-0  trackbacks-0

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

  我們知道Qt以他的signal和slot機(jī)制獨(dú)步天下。但大家在用的時(shí)候有沒(méi)有注意過(guò),signal和slot之間是異步的,還是同步的呢?為此我問(wèn)過(guò)不少使用Qt的道友。有人說(shuō)是同步的,有人說(shuō)是異步的,也有人說(shuō)要看當(dāng)時(shí)你的人品。:( #$%^&*

  為此貧道,特別做了以下幾個(gè)測(cè)試:

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

    

 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ù)里打個(gè)斷點(diǎn),看一下調(diào)用堆棧(call stack)。

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

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

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();
}

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

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

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

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

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

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

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

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

當(dāng)sender和receiver在同一線程時(shí),就是同步模式,而在不同線程時(shí),則是異步模式。

眾人皆曰善。

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

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

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

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

 

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。只見(jiàn)調(diào)用堆棧(call stack)顯示

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

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

此時(shí)柯南君緩緩從口袋中,摸出一張紙,拋向空中,然后轉(zhuǎn)身離去。只見(jiàn)隨風(fēng)飄落的紙面上面摘錄了這么一段Qt源代碼,在Auto模式下,如果要同步調(diào)用,不僅要求sender和receiver是同一線程,而且sender觸發(fā)的時(shí)候,所在的線程也要和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眾人皆驚,原來(lái)在Auto模式下,如果sender的觸發(fā)時(shí)所處的線程和receiver不同,也會(huì)是異步調(diào)用。此時(shí)道友齊聲向柯南喊道“這是全部的真相了嗎”?柯南轉(zhuǎn)過(guò)頭來(lái)笑而不語(yǔ),漸漸又消失在黑暗中。“有多少無(wú)恥可以重來(lái)”漂上了眾人的心頭。望著遠(yuǎn)處的雨后陽(yáng)光,一個(gè)大大的問(wèn)號(hào)也出現(xiàn)在眾人頭頂,"Qt你到底有多無(wú)恥???"。眾人又陷入了沉思。

欲知后事如何,請(qǐng)聽(tīng)下回分解。

 

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

 

 

 

 

 

 




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

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

boost的signal/slot 有一個(gè)很嚴(yán)重的問(wèn)題,就是會(huì)導(dǎo)致編譯非常慢,你寫(xiě)個(gè)小測(cè)試程序是不會(huì)感覺(jué)到的,如果在幾十個(gè)文件中使用的話,編譯時(shí)間會(huì)成倍增長(zhǎng),即使用并行編譯也是慢。都是模板搞的,boost的泛型用得太花哨了。

Qt則完全沒(méi)有這個(gè)問(wèn)題,而且執(zhí)行效率也還可以。  回復(fù)  更多評(píng)論
  
# re: Qt那點(diǎn)事兒(一) 2011-08-30 13:52 | uestc001@163.com
文筆不錯(cuò)  回復(fù)  更多評(píng)論
  
# re: Qt那點(diǎn)事兒(一) 2011-11-07 21:54 | 渡劫導(dǎo)游
某學(xué)過(guò)半個(gè)月Qt的導(dǎo)游落果  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            久久国产黑丝| 久久久久在线| 欧美一区二区三区的| 国产精品久久久久久超碰| 亚洲午夜精品久久| 久久国产乱子精品免费女 | 免费欧美日韩国产三级电影| 国产一区二区三区免费在线观看| 久久国产精品网站| 狠狠色噜噜狠狠色综合久| 久久综合九色综合久99| 亚洲第一天堂无码专区| 99国产精品视频免费观看| 欧美特黄一级大片| 欧美怡红院视频一区二区三区| 99在线精品视频在线观看| 欧美日韩亚洲综合在线| 亚洲欧美在线免费观看| 欧美激情网友自拍| 亚洲一区二区三区精品视频| 国产一区二区三区四区hd| 1000部国产精品成人观看| 亚洲精品久久久久久久久久久久久 | 欧美日韩国产一区二区| 一区二区三区视频免费在线观看| 激情另类综合| 欧美日韩国产精品自在自线| 亚洲欧美日韩在线观看a三区| 在线天堂一区av电影| 国产午夜精品一区二区三区欧美| 99在线热播精品免费| 亚洲一级一区| 亚洲一区二区三区四区五区黄| 亚洲黄色av一区| 欧美国产成人精品| 欧美精品一区二区精品网| 亚洲精品婷婷| 亚洲影院高清在线| 亚洲精品一区二区三区不| 亚洲国产欧洲综合997久久| 久久性天堂网| 国产精品国产三级国产专区53| 一本久久a久久精品亚洲| 国产精品裸体一区二区三区| 欧美**字幕| 久久女同精品一区二区| 亚洲欧美日韩精品久久久| 亚洲人成在线观看网站高清| 国产一区日韩欧美| 国产精品一香蕉国产线看观看| 亚洲尤物视频网| 亚洲精品久久嫩草网站秘色 | 欧美激情精品久久久| 亚洲系列中文字幕| 亚洲激情婷婷| 亚洲国内高清视频| 韩国在线一区| 国产色综合天天综合网| 黄色一区二区在线| 国产精品久久激情| 欧美精品一区二区三区很污很色的 | 亚洲欧美精品中文字幕在线| 亚洲卡通欧美制服中文| 激情婷婷亚洲| 国内成+人亚洲+欧美+综合在线| 久久漫画官网| 午夜精品久久久久久| 亚洲欧美久久| 亚洲欧美日韩国产一区| 在线亚洲一区观看| 99视频精品免费观看| 亚洲尤物在线| 亚洲欧美日韩国产精品| 亚洲午夜久久久久久久久电影网| 国产欧美日韩免费| 国产精品久久久久久久一区探花| 久久精品国产精品亚洲精品| 亚欧美中日韩视频| 久久精品一区| 六月婷婷一区| 欧美 日韩 国产精品免费观看| 日韩一级成人av| 亚洲开发第一视频在线播放| 亚洲成色www8888| 欧美日韩国产一级片| 欧美日韩一区在线视频| 欧美日本亚洲视频| 欧美午夜片在线观看| 欧美激情一区二区在线| 欧美精品高清视频| 欧美日韩情趣电影| 国产欧美日本一区视频| 一区精品在线| 99人久久精品视频最新地址| 亚洲视频图片小说| 欧美一区二区播放| 亚洲日韩视频| 亚洲男人的天堂在线aⅴ视频| 久久午夜激情| 亚洲国产高清一区| 中文国产一区| 久久久久久久91| 99人久久精品视频最新地址| 亚洲一区激情| 久久久亚洲综合| 欧美日韩一区视频| 一区二区三区亚洲| 日韩午夜精品视频| 久久不见久久见免费视频1| 久久久久久9| 亚洲国产经典视频| 欧美一级在线播放| 欧美精品久久99| 国产一区二区按摩在线观看| 亚洲国产综合在线看不卡| 亚洲私人影院在线观看| 久久精品一二三| 欧美揉bbbbb揉bbbbb| 国产综合婷婷| 一区二区三区视频免费在线观看| 国产欧美日韩激情| 亚洲大胆视频| 亚洲女人小视频在线观看| 欧美va亚洲va香蕉在线| 亚洲视频免费| 欧美成人免费在线观看| 国产午夜精品一区二区三区欧美| 国产精品视频一二| 亚洲国产精品毛片| 久久9热精品视频| 亚洲看片网站| 欧美.www| 国产欧美精品一区二区色综合| 国产精品一区免费观看| 亚洲乱码精品一二三四区日韩在线 | 久久精品理论片| 欧美人与性动交cc0o| 伊伊综合在线| 久久国产欧美日韩精品| 99ri日韩精品视频| 欧美大胆成人| 亚洲第一区中文99精品| 久久久水蜜桃| 午夜综合激情| 国产精品wwwwww| 久久资源在线| 欧美黑人一区二区三区| 精品99视频| 久久久精品午夜少妇| 亚洲综合日韩| 国产精品a久久久久| 99热免费精品| 亚洲国产电影| 欧美91视频| 91久久精品国产91久久性色tv| 在线看成人片| 久久综合久久综合这里只有精品| 免费观看成人网| 久久精品国产免费看久久精品| 久久亚洲午夜电影| 国语对白精品一区二区| 久久久91精品国产一区二区三区| 久久综合网hezyo| 久久精品久久综合| 极品少妇一区二区| 男女激情久久| 免费观看国产成人| 欧美午夜片在线免费观看| 一本色道久久综合亚洲精品婷婷| 亚洲欧美日韩一区二区三区在线| 欧美亚洲综合久久| 亚洲影院在线| 国产精品夜夜夜一区二区三区尤| 亚洲成人在线网| 欧美激情久久久久| 欧美精品国产精品日韩精品| 国产精品99久久久久久久久| 亚洲精品美女| 国产精品久久久久影院色老大| 亚洲精品一区二区在线| 欧美激情一区二区| 一本久久青青| 一区二区三区欧美激情| 欧美日韩在线一区| 欧美一二三视频| 99综合精品| 国产精品私房写真福利视频| 久久久久欧美| 久久色在线观看| 亚洲黄色在线| 欧美1区视频| 欧美色另类天堂2015| 亚洲综合不卡| 午夜一区二区三区不卡视频| 一区视频在线播放| 欧美成人高清视频| 欧美激情综合网| 欧美在线啊v一区| 久久国产精品72免费观看| 在线免费观看成人网|