Qtopia 编程部分要点分析 苗忠良
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
常用的Linux工具 压缩工具 内存泄漏检测工具 实时内存监控工具 CPU监控工具
常用的Linux工具 压缩工具 内存泄漏检测工具 实时内存监控工具 CPU监控工具
压缩工具 tar.gz用法: 压缩:tar zcvf *.tar.gz DirName 解压:tar zxvf *.tar.gz Bz2用法: 压缩:tar jcvf *.tar.bz2 DirName 解压:tar jxvf *.tar.bz2 Bz2的压缩更有效率
常用的Linux工具 压缩工具 内存泄漏检测工具 实时内存监控工具 CPU监控工具
内存泄漏检测工具 Valgrind(http://developer.kde.org/~sewardj/)是一个致力于解决所有内存问题的程序,而内存泄漏只不过是其中的问题之一而已。该工具的开发人员是Julian Seward(以Bzip2和Cacheprof而闻名)。该工具宣称自己“是专门致力于解决x86 Linux中开放源代码的内存问题”,事实上,它的确做到了自己的宣言。此外,它还可以描述CPU缓存的使用情况,不过这一功能并不常用。 除了一些常见的问题外,该工具还可以发现内存其它的一些问题,甚至一些POSIX线程方面的问题。缓冲的信息对于大部分程序来说似乎没有必要,不过它是一个查看程序性能的很好方式。
常用的Linux工具 压缩工具 内存泄漏检测工具 实时内存监控工具 CPU监控工具
实时内存监控工具-watch&&free 用法:watch -n 2 -d free watch命令会每两秒执行 free一次,执行前会清除屏幕,在同样位置显示数据。因为 watch命令不会卷动屏幕,所以适合出长时间的监测内存使用率。可以使用 -n选项,控制执行的频率;也可以利用 -d选项,让命令将每次不同的地方显示出来。Watch命令会一直执行,直到您按下 [Ctrl]-[C] 为止.
常用的Linux工具 压缩工具 内存泄漏检测工具 实时内存监控工具 CPU监控工具
CPU监控工具 Linux中常用的监控CPU整体性能的工具有: mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。 vmstat:只能查看所有CPU的平均信息;查看cpu队列信息 iostat: 只能查看所有CPU的平均信息 Sar:与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。 top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示 oprofile:OProfile 是一个低开销的系统全局的性能监视工具。它使用处理器上的性能监视硬件来检索关于内核以及系统上的可执行文件的信息,例如内存是何时被引用的;L2 缓存请求数量;收到的硬件中断数量等
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
事件处理机制 在Qt中,events即对象,当一个事件发生时,Qt通过构造一个适当的QEvent子类来创建一个事件对象来表述事件,并将它通过调用特定对象的实例的event()函数将事件传递给它。所以向一个对象传递事件的时候,经过的第一个函数就是event()。 event()函数并不处理事件,根据event的类型,它调用相应的event handler来进行处理。 当需要对传递给特定对象的事件进行特定处理时,就需要对该对象安装eventFilter,在事件被传递给event()前,对事件进行处理。 当对象需要创建或调用事件时,可以利用sendEvent()和postEvent(),前者会立即发送事件,后者会将事件添加到事件队列中,当主事件循环再次运行时,派发出去。
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
虚拟缓冲机制 Qtopia Core applications write directly to the framebuffer, eliminating the need for the X Window System and saving memory. For development and debugging purposes, Qtopia Core provides a virtual framebuffer allowing Qtopia Core programs to be developed on a desktop machine, without switching between consoles and X11. The virtual framebuffer emulates a framebuffer using a shared memory region and the qvfb tool to display the framebuffer in a window. The qvfb tool also supports a feature known as a skin which can be used to change the look and feel of the display. The tool is located in Qt's /tools/qvfb directory, and provides several additional features accessible through its File and View menus. Please note that the virtual framebuffer is a development tool only. No security issues have been considered in the virtual framebuffer design. It should be avoided in a production environment, i.e. do not configure production libraries with the -qvfb option. Once the virtual framebuffer (the qvfb application) is running, it is ready for use: Start a server application (i.e. construct a QApplication object with the QApplication::GuiServer flag or use the -qws command line parameter. See the running applications documentation for details). Qtopia Core will create a 640 by 480 pixel display by default. Alternatively, the QWS_SIZE environment variable can be used to set another size, e.g. QWS_SIZE=240x320.
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
设计模式在Qtopia中的运用 Singleton模式 Observer模式 组合模式 工厂模式
Singleton模式 意图:保证每个类只有一个实例,并提供一个访问它的全局访问点。 问题:几个不同的客户对象需要引用一个同样的对象,你希望自己拥有的这个对象不超过一个。 解决方案:保证一个实例。 工作方式:拥有一个特点的方法,这个方法被用来实例化需要的对象。当这个方法被调用时,它首先检查该对象是否已被实例化,如果已经被实例化,则返回一个引用,否则实例化该对象,返回引用。 Feature* Feature::getInstance(const QString &key) { QString ukey = key.toUpper(); if (!instances.contains(ukey)) instances[ukey] = new Feature(ukey); return instances[ukey]; } 参考代码:qtopiacore/qt/tool/qconfig/feature.cpp
Observer模式 意图:定义对象间的一对多的依赖关系,当对象中一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 问题:当某个事件发生时,它需要向已系列对象发送通知,而这个对象的列表也是不断变化的。 class Observer { public: virtual ~Observer() { }; virtual void update( Subject* subject ) = 0; }; class Subject virtual ~Subject() { }; virtual void attach( Observer* observer ); virtual void detach( Observer* observer ); virtual void notify(); protected: Subject() { }; private: QList<Observer*> m_observers; inline void Subject::notify() foreach( Observer *observer, m_observers ) { observer->update( this ); } 参考代码:src/libraries/qtopiamedia/observer.h
组合模式 意图:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 参考代码:qtopiacore\qt\src\corelib\kernel\QObject.cpp
工厂模式 意图:定义一个用于创建对象的接口,让子类决定实例化那一个类,将实例化延迟到其子类。 问题:一个类需要实例化另一个类的派生类,但不知道具体是那个派生类。工厂模式允许让派生类来做出决定。 class Q_GUI_EXPORT QMouseDriverFactory { public: static QStringList keys(); static QWSMouseHandler *create(const QString&, const QString &); }; 参考代码:qmousedriverfactory_qws.cpp
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
国际化 为了对字符串进行国际化,常利用tr()来封装字符串,以便在利用lupdate时能够将字符串提取出来,但当字符串会起变化时,简单的利用tr()来封装字符串变得不可行,可行的方式有两种: 利用qt提供的arg()。 对字符串进行分割,调用append()函数来最佳字符串。
主要内容 常用的Linux工具 事件处理机制 虚拟缓冲机制 设计模式在Qtopia中的运用 国际化 搭建开发环境 参考文献
搭建开发环境 基于Source Insight 3.5搭建Qtopia开发环境 基于Eclipse 3.3搭建Qtopia开放环境
搭建开发环境 基于Source Insight 3.5搭建Qtopia开发环境 基于Eclipse 3.3搭建Qtopia开放环境
基于Source Insight 3.5搭建Qtopia开发环境(环境) 根据大多数研发人员可能更熟悉windows平台,出于在Linux下开发qtopia的方便的考虑,搭建开发环境的方法如下: 开放工具及服务: Source Insight 3.5、GCC、Gdb、Samba Server 。 平台: win(代码编写)、Linux(编译调试)
基于Source Insight 3.5搭建Qtopia开发环境(搭建流程) 进行linux各项配置 ,IP地址、网关、防火墙等。 尝试利用ping命令从win下ping linux,尝试利用ping命令从linux下ping win。 当两者都能相互ping通时,说明网络搭建完成。 打开Linux下的Samba Server配置工具,在share标签下添加欲共享给win的linux共享目录。Samba服务建立完成后,从win下运行远程访问,在win“运行”窗口下运行\\linuxIpAddress,就可以看到共享的linux目录了。 然后利用source Insight 3.5创建工程,在source Insight 3.5下进行代码的编写,在Linux下执行有关命令进行编译。
搭建开发环境 基于Source Insight 3.5搭建Qtopia开发环境 基于Eclipse 3.3搭建Qtopia开放环境
基于Eclipse 3.3搭建Qtopia开放环境(环境) 鉴于大多数研发人员更适应利用集成开发环境来进行软件的开发,Eclipse作为一款极为优秀的IDE开放工具已经被大多数开放人员熟悉,本人尝试了下利用Eclipse来搭建开发环境,获得了成功: 开发工具:Eclipse 3.3 、Gcc、Gdb、Java 5 JRE(支持Eclipse 3.3 )。 平台:Linux Eclipse 3.3 下载地址:http://www.eclipse.org/downloads/moreinfo/c.php
基于Eclipse 3.3搭建Qtopia开放环境(搭建环境) 从官方网站下载获得eclipse-cpp-europa-linux-gtk.tar,如果你机器上没有Java 5 JRE,则从Sun官方网站上下载Java 5 JRE。先编译Java 5 JRE,然后将Eclipse 3.3解压到特定目录。 打开Eclipse 3.3后然后创建一个C++的工程,点击projectName右键选择Properties选项。在C/C++ Gereral目录下选择Paths and symbols,在里面添加Lib和Include路径。 点击projectName右键选择Make target,选择Create创建编译命令,编译时采用Build选项选择正确的命令编译。 点击projectName右键选择Debug as,如果是本地应用程序,则采用Local C/C++ Application方式进行调试,如果应用程序不在本地,则采用Open Debug Dialog方式进行调试,在Dialog中可以设置应用程序路径、环境变量、Debug工具等。
参考文献 Alan Ezust, Paul Ezust, Prentice.Hall.PTR.An.Introduction.to.Design.Patterns.in.C.plus.plus.with.Qt.4.Aug.2006.chm, August 31, 2006 Mark G. Sobell , A Practical Guide to Linux Commands, Editors, and Shell , July 01, 2005 Programming.chm Qtopia 4.2 help documentation Eclipse 3.3 help documentation