李先静的专栏

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

用户操作
[即时聊天] [发私信] [加为好友]
李先静ID:absurd
1016873次访问,排名26好友231人,关注者236
Only those who attempt the absurd can achieve the impossible.
absurd的文章
原创 384 篇
翻译 1 篇
转载 57 篇
评论 1517 篇
李先静的公告
个人网站上线: http://www.limodev.cn,以后BLOG将在CSDN和limodev上同时更新,欢迎交流,评论和交换友情链接。
最近评论
rebecca0813:Welcome to our website for age of conan and warcraft gold and rs……
securitydoor:加油哦
SuperKris:应该把rootfs里的/var/tmp改成是指向/tmp的连接,
别的程序也可能用/var/tmp保存临时文件,好像pppd这个拨号程序就是
creative55:牛人,佩服。
thesameway:
51旧书网 同城易书
www.51jiushu.com
www.51jiushu.net
二手书、旧书同城交易平台
分类齐全、快速发布、准确搜索
文章分类
收藏
相册
1.个人相册
2.设计备忘录用图
3.设计本质论用图
4.scim架构用图
6.临时文件
7.其它文件
8.研究笔记用图
marvell-linux
1.友情链接
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
我的相册
3.软界高手
Donald E. Knuth (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.技术资源
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
订阅我的博客
XML聚合  FeedSky

原创 让GtkListStore支持数据延迟加载的构想收藏

新一篇: Linux电源管理研究笔记—acpid工作原理 | 旧一篇: 用GtkTreeView实现ListBox的示例

GtkListStore支持数据延迟加载的构想

 

转载时请注明出处:http://blog.csdn.net/absurd/

 

最近遇到一个问题,在名片列表中要显示全部名片,我们最大名片条数限制是5000条,一下子全部检索过来会非常慢。为了解决这类问题,我们在数据库封装层做了优化,即使全部检索了,但它只从数据库中取前30条,其余数据直到应用程序使用时才从数据库中获取,这种延迟加载的方式会有更好的性能表现。

 

现在才发现数据库封装层做了优化还不够,原因是GtkTreeView(也可以用来实现ListBox)不支持像Win32下的ListBox所具有Ownerdraw(自绘)功能,它需要在开始时就加载所有数据,结果仍然无法实现延迟加载,数据库封装层做的优化失去了效果。

 

为了解决这个问题,需要对GtkListStore改造。分析相关源代码后,我们发现:

1.         GtkTreeView/GtkTreeModel采用了MVC模型。GtkTreeViewview,负责显示控制,而GtkTreeModelmodel,负责数据管理。

2.         GtkTreeModel只是个接口,它有两种实现,GtkListStoreGtkTreeStore,它们分别实现了ListTree的数据管理。

3.         为了支持不同的数据表现形式,GtkTreeView并不负责每个具体项(Item)的绘制,具体项的绘制由GtkCellRenderer完成。GtkCellRenderer有几种不同的实现方式:GtkCellRendererTextGtkCellRendererPixbufGtkCellRendererToggleGtkCellRendererComboGtkCellRendererProgress

4.         在控件显示时,GtkTreeView负责从GtkTreeModel中获得数据,然后把数据传递给GtkCellRenderer,并调用GtkCellRenderer的函数去绘制。

 

很容易想到:在创建时,向GtkTreeModel加入假数据(如记录序号),直到GtkTreeViewGtkTreeModel索取数据时,才从数据库获取。但遇到两个问题:

1.         GtkTreeView和所有GtkWidget一样,先要在size_request里计算控件的大小,这里它要把每一项的get_value调用一遍,也就是说在显示之前仍然要把所有数据取出来。

2.         重载GtkTreeModelget_value函数比较困难。麻烦在于GtkTreeModelIface是个接口,GtkListStore实现了它,它不像普通虚函数可以重载。对于glib接口,你只能去实现这个接口,而不能重载接口的一个函数。

 

对于第一个问题,我们做了些简化处理,因为我们列表中的所有项的高度及宽度一样,在size_request阶段调用get_value时,可以返回一个默认值,说以便GtkTreeView可以计算控件大小。

 

对于第二个问题,我们决定对GtkListStore扩展,而不是重载。让应用程序可以hookGtkListStoreget_value函数的调用。这很简单,设置一个回调函数就行了。

 

做了简单测试,证明此方案可行,但还需要进一步验证。此方案虽然可行,但不够优雅,不知道大家有什么好办法没有。

 

~~end~~

 

 

 

发表于 @ 2006年09月07日 21:19:00|评论(loading...)|编辑

新一篇: Linux电源管理研究笔记—acpid工作原理 | 旧一篇: 用GtkTreeView实现ListBox的示例

评论

#kingoftiger 发表于2006-09-20 11:49:00  IP: 202.112.208.*
请问我如何才能把treeview中的某行加亮
比如:
line-1 2 text-1
line-2 -8 text-1
line-3 1 text-1
line-4 0 text-1
line-5 -3 text-1
现在我需要把第二列小于0的以不同色彩显示!

BTW:怎么每次我看了你的贴并回了后,下次却找不到了呀?


#absurd 发表于2006-09-20 21:34:00  IP: 211.161.63.*
to kingoftiger: 我想可以做到(但没有试过)。通过pango markup language来控制,把小于0的设置成不同的色彩。如果不行,就只能重载gtkcellrenderertext来实现了。
可能是回贴不成功吧,我没有删除过回复。
#assiss 发表于2006-09-21 09:12:00  IP: 159.226.67.*
与其改gtk+的源代码,不如改一下设计思路:
1、非得一次全部显示吗?如果改成分页显示,也许就没这些问题了

2、先分离MODEL,把数据加到MODEL里,然后再view_set_model。为防止界面停止响应,数据加载过程可以用多线程。5000条不算多,速度应该不会很慢吧。

3、不要用scroll_window,而是自己设置滚动条,给滚动条编程,滚动到某位置时再设置treeview相关数据。
#absurd 发表于2006-09-21 22:52:00  IP: 211.161.63.*
to assiss:谢谢,你的想法非常好,我会考虑的。
#rjchen 发表于2006-09-28 11:54:00  IP: 218.247.0.*
我是CSDN的博客产品经理陈瑞江,希望和你认识,方便请加我MSN:rjchen_et@hotmail.com
#absurd 发表于2006-09-29 20:45:00  IP: 211.161.63.*
to rjchen: 已加,很高兴认识你。
#epico 发表于2006-10-26 17:47:00  IP: 61.14.130.*
The "cell-background" property

"cell-background" gchararray : Write

Cell background color as a string.

Default value: NULL
The "cell-background-gdk" property

"cell-background-gdk" GdkColor : Read / Write

Cell background color as a GdkColor.
The "cell-background-set" property

"cell-background-set" gboolean : Read / Write

Whether this tag affects the cell background color.

Default value: FALSE


设置cell的如上Properties,即可。
#badmemory 发表于2008-05-05 22:23:53  IP: 58.212.97.*
您好,我现在在做手机平台,同样使用GTK做的,很荣幸认识您。

关于您的"GtkListStore支持数据延迟加载的构想",我有两点想说,不妥之处请见谅。
(1)我的客户(MMI)给我一个要求,要求GtkTreeView中的GtkCellRendererText支持换行,即显示多行文本,此时不太适应你说的"所有项的高度及宽度一样"

(2)因为GtkListStore支持添加、删除等编辑功能,为何不把您的"数据延迟加载"放在上层(比如MMI),让他们自己控制何时延迟加载。
#badmemory 发表于2008-05-05 22:26:29  IP: 58.212.97.*
我光顾着被您的话题吸引住了,忘记您发的话题已经是很早以前了,现在你们Broncho是怎么解决的
#absurd 发表于2008-05-07 21:19:26  IP: 116.77.17.*
你说的问题确实不好办,最后你们是怎么解决的?
Csdn Blog version 3.1a
Copyright © 李先静