absurd的专栏

欢迎大家加入Linux Mobile Research,本圈子主要致力于基于linux的嵌入式系统的学习和研究,包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面,欢迎大家加入,无论是高手还是新手,一起学习共同进步。

李先静ID:absurd
947083次访问,排名26好友82人,关注者110
Only those who attempt the absurd can achieve the impossible.
absurd的文章
原创 361 篇
翻译 1 篇
转载 55 篇
评论 1469 篇
李先静的公告
Broncho linux手机平台是构建在linux 2.6 之上,采用GTK+作为GUI的手机平台。欢迎大家到broncho.cn上交流,网站还在建设之中,近期我们会陆续把整理好的文档和代码更新到上去。
最近评论
weimecky:" 6) 尽早显示窗口。在创建窗口完成后,马上显示出来,然后再加载数据,避免让用户等得太久。由于gtk_widget_show是异步的,在show之后再调用while(gtk_events_pending()) gtk_main_iteration(),可以让窗口立即显示。"

这一条,我想说的是: gtk_widget_show之后加while(gtk_events_……
weimecky:"去掉_gdk_visual_init中的检测。这个函数比较费时,由于它的检测结果总是固定的,可以直接把结果写到代码里。对broncho说,把整个循环注释掉就行了。"

这一条经过我在手机上(PXA270 312 Mhz)的cpu上打印时间发现只用了1ms而已,并没有发现有如此大的差异? 不过我测试的版本是 gtk 1.2.10(我对比了2.6和1.2的差异,好像这个函数……
weimecky:"预先加载常用动态库。以前我用过这个办法,却得到的相反的结论,速度反而变慢了!后来发现是因为dlopen是以LAZY方式打开的,改用NOW方式之后速度有显著提高,起动时间差不多减少一半。"

请问这个优化措施有没有什么论据支持啊?我在网上查找很多资料都没有发现这个优化措施有任何的证据证明,请absurd大哥给点提示,谢谢!
pondra:收获不小,谢谢分享!
ivy_young:^_^
文章分类
收藏
相册
1.个人相册
2.设计备忘录用图
3.设计本质论用图
4.scim架构用图
6.临时文件
7.其它文件
8.研究笔记用图
marvell-linux
1.友情链接
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
GNOME-CN Planet(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
WindowsMobile&葛涵涛(RSS)
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
情系诗城 (RSS)
我的相册
3.软界高手
Donald E. Knuth (RSS)
侯捷(RSS)
孟岩(RSS)
透明(RSS)
4.LinuxMobile
celinuxforum(RSS)
GPE(RSS)
maemo.org(RSS)
opensource.motorola
palowireless
5.XWindow
Jserv's blog(RSS)
Keith Packard(RSS)
6.技术资源
esnips(RSS)
fourcc(RSS)
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky

原创 数据同步管理器设计备忘录收藏

新一篇: broncho linux手机平台software stack | 旧一篇: DirectFB压力测试工具

数据同步管理器设计备忘录

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

在设计数据同步管理器时,主要考虑到与不同的PC工具和服务器同步,提高与其它手机的互通性的,方便与第三方合作开发一些增值服务。其基本架构如下



SyncSource: 是对数据源的抽象,它提供获取数据对象和更新对象的接口。常见的数据源有名片、日程、短信、彩信、邮件、相片、录音和记事等等。这个本来是很简单的东西,但为了实现快同步,每次只传输变化的数据,要手机端记录ChangeLog,就变得有点麻烦了。


对于数据库记录的同步。每条记录要增加创建时间和最后修改时间字段,有了这两个字段,我们可以根据最后同步时间生成新增记录和修改记录两个集合。要生成删除记录集合,我们还要增加一个表,并为每个表增加一个删除触发器。在删除记录时,把表名、ID和删除时间加到删除表中,据此我们就可以得到删除集合了。


对于文件类的同步。我们在目录里放一个索引文件,里面记录文件的创建时间和删除时间,文件ID和文件名的对应关系。修改时间可以通过stat取到,就不用记录了。同样根据最后同步时间我们可以得到新增,修改,删除和正常四个集合。


SyncSource是插件的方式提供的,增加新的SyncSource只要按这个接口提供一个动态库就行了。它的接口如下:


typedef SyncRet (*SyncSrcRefFunc)(SyncSrc* thiz);

typedef SyncRet (
*SyncSrcUnrefFunc)(SyncSrc* thiz);

typedef SyncID (
*SyncSrcGetIDFunc)(SyncSrc* thiz);

typedef 
const char* (*SyncSrcGetTypeFunc)(SyncSrc* thiz);

typedef 
const char* (*SyncSrcGetNameFunc)(SyncSrc* thiz);

typedef 
const char* (*SyncSourceGetURLFunc)(SyncSrc* thiz);

typedef 
const char* (*SyncSourceGetDescFunc)(SyncSrc* thiz);

typedef size_t (
*SyncSrcGetAllNrFunc)(SyncSrc* thiz);

typedef size_t (
*SyncSrcGetDeletedNrFunc)(SyncSrc* thiz);

typedef size_t (
*SyncSrcGetModifiedNrFunc)(SyncSrc* thiz);

typedef size_t (
*SyncSrcGetNewNrFunc)(SyncSrc* thiz);

typedef SyncObject
* (*SyncSrcGetObjectFunc)(SyncSrc* thiz, SyncObjectType type, size_t index);

typedef SyncRet (
*SyncSrcSetObjectFunc)(SyncSrc* thiz, SyncObject* object);

typedef SyncRet (
*SyncSrcAddObjectFunc)(SyncSrc* thiz, SyncObject* object);

typedef SyncRet (
*SyncSrcUpdateObjectFunc)(SyncSrc* thiz, SyncObject* object);

typedef SyncRet (
*SyncSrcDeleteObjectFunc)(SyncSrc* thiz, SyncObject* object);

typedef SyncRet (
*SyncSrcBeginSyncFunc)(SyncSrc* thiz, SyncKind type, time_t last_sync, SyncDataFilter* filter);

typedef SyncRet (
*SyncSrcEndSyncFunc)(SyncSrc* thiz, SyncRet result);

typedef SyncObject
* (*SyncSrcCreateObjectFunc)(SyncSrc* thiz);

struct _SyncSrc

{

SyncSrcRefFunc 
ref;

SyncSrcUnrefFunc unref;

SyncSrcGetIDFunc get_id;

SyncSrcGetTypeFunc get_type;

SyncSrcGetNameFunc get_name;

SyncSourceGetURLFunc get_url;

SyncSourceGetDescFunc get_desc;

SyncSrcBeginSyncFunc begin_sync;

SyncSrcEndSyncFunc end_sync;

SyncSrcGetAllNrFunc get_all_nr;

SyncSrcGetDeletedNrFunc get_deleted_nr;

SyncSrcGetModifiedNrFunc get_modified_nr;

SyncSrcGetNewNrFunc get_new_nr;

SyncSrcGetObjectFunc get_object;

SyncSrcSetObjectFunc set_object;

SyncSrcAddObjectFunc add_object;

SyncSrcUpdateObjectFunc update_object;

SyncSrcDeleteObjectFunc delete_object;

SyncSrcCreateObjectFunc create_object;


char priv[0];

}
;


SyncEngine: 是对具体同步方式的抽象。比如TCard备份是一个简单的engine,在备份时,它把SyncSource提供的数据存到TCard中,在恢复时,从Tcard中取出数据,并把数据存到 SyncSource中。Sync4JEngine负责通过SyncMLfunambol服务器同步。ActiveSyncEngine负责与ActiveSync同步。第三方增加新的同步方式只要实现下面的接口:


typedef SyncRet     (*SyncEngineRefFunc)(SyncEngine* thiz);
typedef SyncRet     (
*SyncEngineUnrefFunc)(SyncEngine* thiz);
typedef SyncID      (
*SyncEngineGetIDFunc)(SyncEngine* thiz);
typedef 
const char* (*SyncEngineGetNameFunc)(SyncEngine* thiz);
typedef SyncRet     (
*SyncEngineBeginSyncFunc)(SyncEngine* thiz, SyncPartnerConfig* partner_config, SyncDataFilter* filter);
typedef SyncRet     (
*SyncEngineSyncFunc)(SyncEngine* thiz, SyncSrc* source, time_t last_sync, SyncKind type);
typedef SyncRet     (
*SyncEngineCancelFunc)(SyncEngine* thiz);
typedef SyncRet     (
*SyncEngineEndSyncFunc)(SyncEngine* thiz);
typedef SyncRet     (
*SyncEngineRegEventListenerFunc)(SyncEngine* thiz, SyncOnEventFunc on_event, void* ctx);
typedef SyncRet     (
*SyncEngineRegProgressListenerFunc)(SyncEngine* thiz, SyncOnProgressFunc on_progress, void* ctx);

struct _SyncEngine
{
        SyncEngineRefFunc                  
ref;
        SyncEngineUnrefFunc                unref;
        SyncEngineGetIDFunc                get_id;
        SyncEngineGetNameFunc              get_name;
        SyncEngineBeginSyncFunc            begin_sync;
        SyncEngineSyncFunc                 sync;
        SyncEngineCancelFunc               cancel;
        SyncEngineEndSyncFunc              end_sync;
        SyncEngineRegEventListenerFunc     reg_event_listener;
        SyncEngineRegProgressListenerFunc  reg_progress_listener;

        
char priv[0];
}
;

SyncEngineSettings主要负责SyncEngine的设置,每个SyncEngine插件都要提供一个SyncEngineSettings插件,SyncEngineSettings是和GUI相关的,所以与SyneEngine分开提供。SyncEngineSettings的接口很简单:


struct _SyncEngineSettings;
typedef 
struct _SyncEngineSettings SyncEngineSettings;

typedef SyncID (
*SyncEngineSettingsGetIDFunc)(SyncEngineSettings* thiz);
typedef 
const char* (*SyncEngineSettingsGetNameFunc)(SyncEngineSettings* thiz);
typedef SyncRet (
*SyncEngineSettingsEditPartnerFunc)(SyncEngineSettings* thiz, SyncPartnerConfig* partner_config, SyncSettingsEditDoneFunc done, void* ctx);
typedef SyncRet (
*SyncEngineSettingsRefFunc)(SyncEngineSettings* thiz);
typedef SyncRet (
*SyncEngineSettingsUnrefFunc)(SyncEngineSettings* thiz);

struct _SyncEngineSettings
{
        SyncEngineSettingsRefFunc          
ref;
        SyncEngineSettingsUnrefFunc        unref;
        SyncEngineSettingsGetIDFunc        get_id;
        SyncEngineSettingsGetNameFunc      get_name;
        SyncEngineSettingsEditPartnerFunc  edit_partner;

        
char priv[0];
}
;


~~end~~




发表于 @ 2008年04月20日 13:49:00|评论(loading...)|编辑

新一篇: broncho linux手机平台software stack | 旧一篇: DirectFB压力测试工具

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 李先静