注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

Qt的signal-slot机制与call back机制,boost signal-slot机制性能比较[原创]  

2010-08-28 07:29:56|  分类: c++学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

         Qtsignal-slot机制对程序提供了极大的灵活性,call-back机制也提供了一定的灵活性,但是如果使用call-back机制并且在工程较大时,要经过仔细设计,也容易出错。出现未定义的call-back函数是常有的事。Core-dump听了就头大。Signal-slot可以在类对象不知对方的实现的情况下传递信息。比之call-back更加灵活安全。Signal-slot本人也是初学,在此比较一下call-backsignal-slot的性能代价,在使用时他可以做个权衡。

         下面是主要代码:

//test.h

#ifndef TEST_H

#define TEST_H

 

#include <QObject>

 

class Test : public QObject

{

    Q_OBJECT

public:

    typedef void (*Proc)(int);

    explicit Test(QObject *parent = 0);

    void Test_Signal(int value);

    void Test_CallBack(int value);

    void Set_CallBack(Proc proc);

signals:

    void Signal(int);

public slots:

    void Foo(int);

private:

    Proc proc;

};

 

#endif // TEST_H

//test.cpp

#include "test.h"

#include "global.h"

#include<iostream>

using namespace std;

Test::Test(QObject *parent) :

    QObject(parent)

{

    this->proc = NULL;

    connect(this,SIGNAL(Signal(int)),this,SLOT(Foo(int)));

}

void Test::Foo(int value)

{

    process_value(value);

}

void Test::Test_Signal(int value)

{

    emit Signal(value);

}

void Test::Set_CallBack(Proc proc)

{

    this->proc = proc;

}

void Test::Test_CallBack(int value)

{

    if(proc!=NULL)

    {

        proc(value);

    }

}

//main.cpp

#include <QtGui/QApplication>

#include <QObject>

#include <iostream>

#include "mainwindow.h"

#include "measure.h"

#include "test.h"

#include "global.h"

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    //MainWindow w;

    //w.show();

    KBestMeasure measure;

    measure.setK(10);

    measure.setDeriviation(0.01);

    Test t;

    t.Set_CallBack(process_value);

 

    while(measure.isOk()==false)

    {

        measure.start();

        for(int i=0;i<100;++i)

        {

            t.Test_Signal(i);

        }

        measure.stop();

    }

    cout<<"Signal-Slot time:"<<measure.getResult()<<endl;

    measure.clear();

    while(measure.isOk()==false)

    {

        measure.start();

        for(int i=0;i<100;++i)

        {

            t.Test_CallBack(i);

        }

        measure.stop();

    }

    cout<<"Call-Back time:"<<measure.getResult()<<endl;

    return a.exec();

}

代码放这里。

https://cid-27156b4de6867efb.office.live.com/self.aspx/%e4%bb%a3%e7%a0%81/qt2.rar

boost 的signal-slot是最近学习的,最后追加在这里,boost的signal不能直接connect成员函数指针,这就使得要使用十分奇怪的语法,估计以后这个问题会得到解决。

核心代码发在下面

class Test_Boost_Slot< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

{

public:

    void operator()(int value)

    {

        process_value(value);

    }

    void Foo(int value)

    {

        process_value(value);

    }

};

 

Test_Boost_Slot boost_test_slot;

 

boost::signals2::signal<void (int)> sig;

sig.connect(boost_test_slot);

 

boost::signals2::signal<void (int)> sig_member_function;

sig_member_function.connect(bind(&Test_Boost_Slot::Foo,&boost_test_slot,_1));

 

结果:

Signal-Slot time:257.95
Call-Back time:14
Boost-Signal-Slot time:443.05
Boost-Signal-Slot2 time:452.1

signal-Slot效率是远不如call-back的,这样signal-slot在用在计算密集程序或是强调效率的地方是不成的,在gui交互上倒不会产生太大性能问题。boost 的signal和slot性能更是不如Qt,但是boost是一个跨平台的无依赖的库,你可以在任何工程中使用它,而Qt的signal-slot则只能在Qt的工程中使用,而Qt都是要经过一层moc的处理,结果代码调式不易,这样比较起来boost的signal-slot就更具有价值了,而且随差c++版本的更新,库的实现会有新的核心支持,可能以后的实现会更有有效率,毕竟这是一个十分有用的功能。本人对boost库有很大的信心。

 

  评论这张
 
阅读(2820)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018