摘要: Vector的删除方法使用中存在以下注意点:1、尽量不要使用remove方法,因为这是在list接口中提供的方法2、尽量使用removeelementAt方法,这是正规的vector的方法以下代码看似没有问题,其实问题非常的大,出错时可以使整个线程挂起![代码]这样的代码运行过程中可能会出现arrayindexoutofbound的出错这是因为:removeElementAt方法每次执行完毕后会将vector的size减1而这个方法每次执行的时候都会检查参数index和vector的size的大小关系,如果index = size,就会出现以上的错误所以,上述代码中,当删到index = 阅读全文
posted @ 2011-01-03 12:50 super119 阅读(268) 评论(0) 推荐(0)
摘要: [代码] 阅读全文
posted @ 2011-01-03 12:49 super119 阅读(184) 评论(0) 推荐(0)
摘要: SyntaxCheck 检查代码是否符合自定义语法/Files/super119/SyntaxCheck.rar 阅读全文
posted @ 2011-01-03 12:48 super119 阅读(202) 评论(0) 推荐(0)
摘要: [代码]这里还有一个将两个byte数组相加的方法:[代码]一点注意:在s.receive一句之前加上这句:socket.setSoTimeout(5000); //设置5秒的timeout这样可以防止,在没有东西receive的时候,程序被block 阅读全文
posted @ 2011-01-03 12:46 super119 阅读(636) 评论(0) 推荐(0)
摘要: 众所周知,Sun和MS的一场官司最终有了个很不好的结局:双方分道扬镳了。最倒霉的当然是我们这些java程序员了,一个很不利的一点在于WEB上的JAVA技术的实现。下面以我尝试在applet中使用JAVA2平台标准版中的最新的Swing技术为例,阐述一下相应的入门问题。先澄清几个概念:1):JDK和J2SDk:J2SDk包含了Java Development kit(JDK)、Java Runtime Environment(JRE)和Java Plug-in。原先sun的JAVA软件开发工具包是JDK,现在就称为J2SDk了。JRE和plug-in:J2RE包含了java plug-in。su 阅读全文
posted @ 2011-01-03 12:44 super119 阅读(477) 评论(0) 推荐(0)
摘要: 1、applet本身有限制:不能读写本地文件系统、不能和第三方进行任何通信,除了提供该applet下载的服务器本身2、applet写好之后,不能使用applet标签来发布在html里,必须使用sun的HtmlConverter工具来将applet标签转换成为object标签方可,这一点看上一篇帖子3、 applet调试过程中,善用java控制台。java控制台是一个非常有用的终端,可以用来调试applet。当发现applet的class怎么也 not found的时候,打开控制台,输入l(小写的L)命令,就可以打印出当前jre搜索applet的路径,你就会发现jre到底找到什么地方去了。此外, 阅读全文
posted @ 2011-01-03 12:43 super119 阅读(1556) 评论(0) 推荐(0)
摘要: 方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:[代码]这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,这时如果我们又不想建立一个新的类,应该怎么办呢?  我们不妨来探索一种新的方法:我们不创建 Thread 类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给 Thread 类的实例,有点类似回调函数。但是 Java 没有指针,我们只能传递一个包含这个方 阅读全文
posted @ 2011-01-03 12:42 super119 阅读(3712) 评论(0) 推荐(1)
摘要: Hashtable和HashMap的区别:1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类;2.Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable 了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:Map Collections.synchronizedMap(Map m)这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的Hash 阅读全文
posted @ 2011-01-03 12:41 super119 阅读(224) 评论(0) 推荐(0)
摘要: 1、Javascript要访问的Applet的方法或属性必须都是public的2、在html中给applet的name属性赋值,以前是用applet标签,现在要用object,也是一样,如下(看红色name属性):[代码]3、在javascript中直接就可以访问了,如下:[代码]这种方法只在IE中有效,在Firefox中无效。后面将有一篇文章谈到如何在Firefox和IE中都能让JavaScript和JAVA通讯。 阅读全文
posted @ 2011-01-03 12:40 super119 阅读(642) 评论(0) 推荐(0)
摘要: 使用JAVA的random类可以来产生随机数,但不要每次使用都new Random这个类对象,因为这个类是以当前系统时间来作为seed生成随机数的,如果每次都new(特别是在一个循环里面new,间隔时间非常短),那么,生成的随机数就有可能都是一样的,或是非常相近的!For example:不要这样写:for (int i = 0; i 100; i++) {System.out.println(new Random().nextInt());}要这样写:private static Random obj = new Random();for (int i = 0; i 100; i++ 阅读全文
posted @ 2011-01-03 12:39 super119 阅读(803) 评论(0) 推荐(0)
摘要: The conditional compilation practice is used to optionally remove chunks of code from the compiled version of a class. It uses the fact that compilers will ignore any unreachable branches of code.To implement conditional compilation,* define a static final boolean value as a non-private member of so 阅读全文
posted @ 2011-01-03 12:38 super119 阅读(536) 评论(0) 推荐(0)
摘要: Java 定义的位运算(bitwise operators )直接对整数类型的位进行操作,这些整数类型包括long,int,short,char,and byte 。表4-2 列出了位运算:表4.2 位运算符及其结果运算符 结果~ 按位非(NOT)(一元运算)& 按位与(AND)| 按位或(OR)^ 按位异或(XOR) 右移 右移,左边空出的位以0填充运算符 结果 左移&= 按位与赋值|= 按位或赋值^= 按位异或赋值= 右移赋值= 右移赋值,左边空出的位以0填充= 左移赋值续表既然位运算符在整数范围内对位操作,因此理解这样的操作会对一个值产生什么效果是重要的。具体 阅读全文
posted @ 2011-01-03 12:37 super119 阅读(2407) 评论(0) 推荐(0)
摘要: [代码] 阅读全文
posted @ 2011-01-03 12:35 super119 阅读(1828) 评论(0) 推荐(1)
摘要: 在java前台程序的开发过程中,经常要把大量JSP中的文本key抽取出来,放到Property文件中,非常麻烦,于是写了这么一个工具。这个程序在JSP文件中查找"jsp.xxxxxx"这样的字符串(一行上如果有多个这样的字符串也能找出来),然后填充到一个HashMap中(利用这个字符串做key,这样避免我们过滤出来的字符串有duplicated的问题),最后写到Property文件中,接下来只需要到Property文件中填写value就可以了。同样的,对于java文件,也会查找action.xxx, form.xxx, bean.xxx等这样的字符串,然后抽取出来。所以说,本工具最关键的地方就 阅读全文
posted @ 2011-01-03 12:33 super119 阅读(474) 评论(0) 推荐(0)
摘要: 一般的网络程序中大量使用了StringTokenizer来分割后台传过来的字符串。但是这个class是有问题的,起码他不是按照我的想法来工作的,主要问题就是当我们定义的delimiter含有多个字符的时候,StringTokenizer认为这些字符都是delimiter,而不是这个字符串这个整体是一个delimiter比如这样的代码:[代码]这样的代码会发现打印出来的东西是:mnode91234end这显然是不行的,所以,我们遵照JDK中的建议,使用String类本身的split方法来代替,split中可以填写一个RE,功能要强大很多,不过对EasyCluster代码的修改也是比较痛苦的。使用 阅读全文
posted @ 2011-01-03 12:32 super119 阅读(410) 评论(0) 推荐(0)
摘要: 很简单的代码,只是遍历目录,然后将所有的文件(不包括目录)名(含绝对路径)放到一个ArrayList中,最后打印该ArrayList。不过在这个基础上可以开发很多有用的东西,本代码关键是演示如何遍历的:[代码] 阅读全文
posted @ 2011-01-03 12:31 super119 阅读(302) 评论(0) 推荐(0)
摘要: 先把JDialog的类创建好,在Netbeans中通过GUI的界面可以把界面画好。然后调用的方法是这样:[代码] 阅读全文
posted @ 2011-01-03 12:30 super119 阅读(677) 评论(0) 推荐(0)
摘要: Java5/6中的字体自定义设置与美化(Linux/Windows)默认情况下,Java应用程序中的中文字体和英文字体是分开使用的,这样导致不能同时使用某个英文字体和某个中文字体来显示同个程序中包含中文和英文的文字。例如,在Netbeans中不能使用Courser 10 Pitch字体(Windows下为Courser New)和某个中文字体(比如宋体或微软雅黑)来显示一个java源代码,如果选择Courser字体,那么源代码中的中文就无法显示,如果选择宋体或雅黑,那么英文字体则是采用默认映射的某个字体。网络上给出了许多方法,但都只是给出某些简单的方法来解决java中文乱码问题,没讲清楚基本原 阅读全文
posted @ 2011-01-03 12:29 super119 阅读(2286) 评论(0) 推荐(0)
摘要: 主要是两个方法:setVisible(true/false)这个方法用来显示/隐藏JDialog的界面,并不能析构JDialogdispose()这个方法能析构JDialog,但是建议在调用JDialog显示的代码中调用这个函数,因为如果在JDialog本身的代码中调用dispose(比如我们有个JDialog,有个cancel按钮,在cancel按钮的响应代码中调用dispose),那这样调用JDialog的人,就无法再访问JDialog中的一些变量了,所以建议调用者调用这个dispose函数。 阅读全文
posted @ 2011-01-03 12:29 super119 阅读(678) 评论(0) 推荐(0)
摘要: float,double都有误差,适合做科学计算或工程计算,像商业应用,特别是购物,计费等系统,就一定要用这个BigDecimal,精确。比如我们定义一个double是0.01,可能将来打印出来或计算的时候,实际上是0.010000000003456这样的数值,那么,如果我们用这样的数值去计算的话,随着计算的增多和double数的增多,误差就会越来越大,这在商业计算中是不允许的。比如,有可能10块钱在我们程序中就是9.999999999999348,这样,这个人就买不了10块钱的东西了。而且,float、double这些东西有时还会变成科学技术法的表示方法,也挺烦人的。比如,在我们的EasyC 阅读全文
posted @ 2011-01-03 12:25 super119 阅读(3502) 评论(0) 推荐(0)
摘要: Java在实例化一个对象的时候,如果没有显式使用super(),则会先调用父类的无参构造函数(不是和自己构造函数参数数量对应的那个),然后调用子类的构造函数,如果父类不是Object类,则一直向上追溯到Object类为止,super()只能在构造函数的第一行使用,在别的地方使用均为非法,一般情况下构造函数不用写super(),但是如果一个类有多个构造函数的时候,为了便于理解,往往要显式调用super()。下面示例代码的运行结果为:I am fatherI am son:baiduI am fatherI am son示例代码:[代码] 阅读全文
posted @ 2011-01-03 12:25 super119 阅读(1045) 评论(0) 推荐(0)
摘要: GStreamer的Plugin Writer's Guide通篇都没有给出一个完整的plugin的源代码列表,也没有描述如何build和install一个plugin,针对这一点,研究了一下gstreamer plugin template,发现是一个基于autoconf, automake的project,一般情况下,直接运行autogen.sh就会自动生成configure,然后configure,接着只需要make, make install即可。make install会把生成的.so安装到/usr/local/lib/gstreamer-0.10目录下。尝试build,却发现mak 阅读全文
posted @ 2011-01-03 11:30 super119 阅读(1702) 评论(0) 推荐(0)
摘要: 从gstrtpjitterbuffer.c中使用activatepush_function来看gstreamer中的激活机制有关函数gst_pad_set_activatepush_function。这个可以看gstreamer包中doc/design目录下的part-activation.txt这篇文档,这篇文档将pad active的逻辑说的还是比较清楚的。首先gstreamer core会调用pad的activate方法(如果我们调用gst_pad_set_activate_function重载了的话),在这个方法中,必须最后要调用gst_pad_activate_push和gst_pa 阅读全文
posted @ 2011-01-03 11:29 super119 阅读(1250) 评论(1) 推荐(0)
摘要: 简单来讲,采样率和比特率就像是坐标轴上的横纵坐标。横坐标的采样率表示了每秒钟的采样次数。纵坐标的比特率表示了用数字量来量化模拟量的时候的精度。采样率类似于动态影像的帧数,比如电影的采样率是24赫兹,PAL制式的采样率是25赫兹,NTSC制式的采样率是30赫兹。当我们把采样到的一个个静止画面再以采样率同样的速度回放时,看到的就是连续的画面。同样的道理,把以44.1kHZ采样率记录的CD以同样的速率播放时,就能听到连续的声音。显然,这个采样率越高,听到的声音和看到的图像就越连贯。当然,人的听觉和视觉器官能分辨的采样率是有限的,基本上高于44.1kHZ采样的声音,绝大部分人已经觉察不到其中的分别了。 阅读全文
posted @ 2011-01-03 11:29 super119 阅读(6203) 评论(0) 推荐(0)
摘要: 这里需要描述一下gst_pad_get_caps/gst_pad_set_getcaps_function, gst_pad_set_caps/gst_pad_set_setcaps_function这四个函数。gst_pad_get_caps函数用来返回该pad能接受的caps。这个函数的逻辑是:首先检查getcaps函数指针是否为NULL,如果不是则调用getcaps函数,这是一个函数指针,我们可以通过gst_pad_set_getcaps_function来给这个函数指针赋值,从而实现自定义的get_caps函数的逻辑。完成后函数返回;如果getcaps函数指针为NULL,则gst_pa 阅读全文
posted @ 2011-01-03 11:28 super119 阅读(2005) 评论(1) 推荐(0)
摘要: 来看这个函数:gst_rtp_buffer_compare_seqnumCODE:SELECT ALLgintgst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2){ return (gint16) (seqnum2 - seqnum1);}就简单的一句代码,就能判断出seqnum1, seqnum2是否有wraparound的现象。关键点就在于return后面的gint16类型转换上。seqnum1, seqnum2都是guint16,也就是unsigned short,而返回值被强制转换成了gint16,也就是sig 阅读全文
posted @ 2011-01-03 11:28 super119 阅读(884) 评论(0) 推荐(0)
摘要: 想让xvimagesink/ximagesink这样的element在我们指定的窗口中绘制video?简单的很:1. new一个GtkDrawingArea2. connect它的expose-event signal,e.g:// Drawing on our drawing areag_signal_connect(G_OBJECT(area), "expose-event", G_CALLBACK(expose_cb), NULL);3. 书写callback函数expose_cb,e.g:[代码]这样就OK了。expose-event是drawingarea每次重绘的时候会发出的sig 阅读全文
posted @ 2011-01-03 11:27 super119 阅读(1589) 评论(0) 推荐(0)
摘要: 1. 获取duration的话,有几个途径:(1)在bus上监听GST_MESSAGE_DURATION,如果有这个消息到来,用gst_message_parse_duration就可以获得。但是往往element不会发这样的message出来 (2)用gst_query_new_duration新建一个duration query,然后用gst_element_query(pipeline, query)查询即可。这种方法较为常用。一般可以在pipeline所有element都link好了,pipeline状态是RUNNING的时候,就可以查询了。2. 获取当前播放的position,也有几 阅读全文
posted @ 2011-01-03 11:26 super119 阅读(1219) 评论(0) 推荐(0)
摘要: g_closure_marshal提供了一些常用的closure的实现,但是由于返回值和参数列表的可能性实在太多,无法穷举,所以,gobject提供了一个程序:glib-genmarshal来帮我们生成指定的closure的实现(自动生成代码)。在当前目录下创建一个文件,比如:marshal.list,包含内容如下:VOID:UINT,UINT就是返回值和参数列表。然后:glib-genmarshal --header --prefix=gst_play_marshal marshal.list这样就生成了头文件的内容,保存下来存成gstplay-marshal.h,搞定。glib-genma 阅读全文
posted @ 2011-01-03 11:26 super119 阅读(1005) 评论(0) 推荐(0)
摘要: [代码] 阅读全文
posted @ 2011-01-03 11:25 super119 阅读(1314) 评论(0) 推荐(0)
摘要: GstPipeline在从PAUSED转成PLAYING的时候,会select一个clock并计算出basetime,这两样东西都会赋给pipeline中每个element。那这个basetime每次是怎么计算的呢?原来认为这个basetime就是当前的clock time,但是后来发现不对。比如:在播放了2秒的时候PAUSE,等了3秒后再PLAY,此时如果这个basetime是当前时间的话,那就是5秒时刻,此时继续播放的话,会发现传过来的buffer中的timestamp是从第3秒开始的,不是从0秒开始的,因为上次暂停的时候是在2秒的时间点上。所以如果此时basetime是5秒的话,那么si 阅读全文
posted @ 2011-01-03 11:21 super119 阅读(1298) 评论(0) 推荐(1)
摘要: aplay -t raw -c 1 -f S16_LE -r 8000 test2.pcm-t: type raw表示是PCM-c: channel 1-f S16_LE: Signed 16bit-width Little-Endian-r: sample rate 8000PCM是最raw的音频数据,没有任何头信息。WAV文件就是PCM+头信息,头信息就是上述的声道数,sample rate这些。所以WAV文件可以直接播放,而PCM需要手动指定这些信息之后才能播放。 阅读全文
posted @ 2011-01-03 11:20 super119 阅读(3566) 评论(0) 推荐(1)
摘要: 看了MP4Box的源码,后来对照代码参看了H.263的Specification,取宽高的 方法如下:1. 读前22个bit(不是byte),然后转成int,这个值应该是32(0x20)。这是H.263 stream的start code,表示这是一个H.263的stream2. 读第36-38bit,转成int,这个值就表示该263 stream的format,对应表如下:[代码]具体到宽高,这里直接引用MP4Box中的代码(变量fmt就是36-38bit表示的值):staticvoidh263_get_pic_size(GF_BitStream*bs,u32fmt,u32*w,u32*h) 阅读全文
posted @ 2011-01-03 11:18 super119 阅读(957) 评论(8) 推荐(0)
摘要: Linux核心幾個重要跟時間有關的名詞或變數,底下將介紹HZ、tick與jiffies。HZLinux核心每隔固定週期會發出timer interrupt (IRQ 0),HZ是用來定義每一秒有幾次timer interrupts。舉例來說,HZ為1000,代表每秒有1000次timer interrupts。HZ可在編譯核心時設定,如下所示 (以核心版本2.6.20-15為例):adrian@adrian-desktop:~$ cd /usr/src/linuxadrian@adrian-desktop:/usr/src/linux$ make menuconfigProcessor typ 阅读全文
posted @ 2011-01-03 11:16 super119 阅读(863) 评论(0) 推荐(0)
摘要: Linux可以让多个设备共享一个中断号,而且共享同一中断的中断处理程序形成一个链表,内核对每个中断处理程序都要执行,那么,没有产生中断的设备本该靠边站的,它的中断处理程序也被执行了?到底是怎么会事?实际上:共享的处理程序与非共享的处理程序在注册和运行方式上比较相似,但差异主要有以下三处:* request_irq()的参数flags必须设置SA_SHIRQ标志。* 对每个注册的中断处理程序来说,dev_id参数必须唯一。指向任一设备结构的指针就可以满足这一要求;通常会选择设备结构,因为它是唯一的,而且中断处理程序可能会用到它。不能给共享的处理程序传递NULL值。* 中断处理程序必须能够区分它的 阅读全文
posted @ 2011-01-03 11:16 super119 阅读(733) 评论(0) 推荐(0)
摘要: ------------- Auto Configuration --------------------PCI provides two separate 32-bit or 64-bit address spaces corresponding to the memory and I/O port address spaces of the x86 processor family. Addresses in these address spaces are assigned by software. A third address space, called the PCI Config 阅读全文
posted @ 2011-01-03 11:15 super119 阅读(660) 评论(0) 推荐(0)
摘要: 这次调试rtspgoogle这个RTSP extension的时候,发现问题:在gst-inspect的时候,能看到这个element。但是在rtspsrc初始化extension列表的时候,这个element没有被找出来。导致youtube上的视频播放不了(因为rtspgoogle这个extension没有发挥作用)原因是这样的:rtspsrc在class_init里面调用了gst_rtsp_ext_list_init。而每个element的class_init是在gst_init的时候调用的,所以,如果rtspsrc的class_init在执行的时候,rtspgoogle的class_in 阅读全文
posted @ 2011-01-03 11:14 super119 阅读(891) 评论(0) 推荐(0)
摘要: If you have a new kernel config file, e.g, named dot_config. You wanna use this config file while building kernel. So you copied this file into kernel src dir/arch/arm/configs, and:make dot_configKernel will complain: No rule for target "dot_config" found.Why? Just simple -- all predefined kernel 阅读全文
posted @ 2011-01-03 11:14 super119 阅读(575) 评论(0) 推荐(0)
摘要: 比如把代码里面所有的close调用,替换成alpclose。于是写了一个脚本,有了一些收获。脚本如下:[代码]1. 使用grep -E来打开grep的扩展正则表达式的功能。所谓扩展,就是像+, ()这样的元字符才能使用。sed使用-r来打开扩展正则表达式。打开了扩展之后,如果要表示一个常量的+, (),就需要用\来转义了。2. grep -e可以用来表示多个匹配pattern3. 最后一句sed的时候,使用了正则表达式中的分组功能,也就是将[ =({;?:\t]+这个部分定义成一个组,然后在后面就可以用\1来引用(注意\0已经被默认分配成整个pattern)。如果定义了第二个组,那么就用\2来 阅读全文
posted @ 2011-01-03 11:13 super119 阅读(955) 评论(0) 推荐(0)
摘要: 打开gstreamer debug一般方法是:export GST_DEBUG=filesrc:5这样的做法,然后运行程序。但是通过看gstreamer的代码,这个环境变量是在gst_init的时候被读取并设置的,具体是在init_pre这个函数里面。如果程序已经在运行了,gst_init已经做过了,这个时候要打开debug怎么办呢?(Media server就有这样的需求)。通过看init_pre中的代码,发现很简单,直接调用gst_debug_set_threshold_for_name或gst_debug_set_default_threshold就可以。下面是测试代码:[代码] 阅读全文
posted @ 2011-01-03 11:11 super119 阅读(3354) 评论(0) 推荐(0)
摘要: Q: Bus message和Event有什么不同?和signal又有什么不同?A:bus message是用于gstreamer和application之间交互用的,比如EOS,如果是bus message则是gstreamer告诉app -- End of Stream。而Event是用于gstreamer内部的,比如src element发出EOS Event,然后该event顺着pipeline一路传递到downstream elements,这些elements可以得到通知,从而做一些cleanup的工作,然后继续将event传递下去。这应该就是bus message和event不同 阅读全文
posted @ 2011-01-03 11:09 super119 阅读(2144) 评论(0) 推荐(0)
摘要: H.264与MPEG4区别MPEG系列的标准归属于ISO/IEC,但另一方面以制订国际通讯标准为主的机构:ITU-T,在完成H.263(针对视频会议之用的串流视频标准)后展开了更先进的H.264制订,且新制订是与ISO/IEC机构连手合作,由两机构共同成立一个名为JVT(Joint Video Team)的联合工作小组,以MPEG-4技术为基础进行更适于视频会议(Video Conference)运用的衍生发展,也因为是联合制订,因此在ITU-T方面称为H.264,在ISO/IEC的MPEG方面就称为MPEG-4 Part 10(第10部分,也叫ISO/IEC 14496-10),MPEG-4 阅读全文
posted @ 2011-01-03 11:09 super119 阅读(7594) 评论(1) 推荐(1)
摘要: 1. 每个element/bin都有current,next,pending三个成员变量表示状态。current和next很好理解,pending一般就是我们给该element设置的最终的状态,比如调用gst_element_set_state函数设置PLAYING state,则这个pending一般就是PLAYING。代码中还看到有一个宏GST_STATE_TARGET,这个TARGET一般也和pending一样,表示最终要设置的state(final state)2. gst_element_set_state_func函数(gst_element_set_state的缺省实现)会调用g 阅读全文
posted @ 2011-01-03 11:08 super119 阅读(1975) 评论(0) 推荐(0)
摘要: 在写gstreamer element的时候,不能使用全局变量。因为element可能在一个进程中被创建多个,比如一个pipeline中就可能有多个queue。要把这些变量全部放到该element的class中去,作为成员变量即可。因为一个进程如果使用了多个该element的话,会创建多个GObject,所以,成员变量也会有多份。如果写成全局变量,那就所有的object共享一个了,会出问题。(其实就把GObject看成一个structure好了,多个GObject在内存中就是多个structure,所以,成员变量不会冲突。而全局变量始终只有一份的)。之前还写代码研究过动态库中的全局变量的问题。 阅读全文
posted @ 2011-01-03 11:07 super119 阅读(769) 评论(0) 推荐(1)
摘要: OProfile的原理比较简单:现在的很多CPU都提供一个所谓性能计数器的东西(performance counter),大致的原理就是程序可以注册告诉CPU对什么event感兴趣(比如CPU_CYCLE,CPU经历了一次时钟周期),然后CPU在执行了相应的操作后,就会在性能计数器上加1,这样程序就可以取出。所以,使用OProfile来定位CPU使用率的问题,就变成了让oprofile收集程序运行过程中哪个可执行程序(或是so)中的哪个function,消耗的CPU CYCLE最多。OProfile不是每次有了event都会记录下来的,OProfile有一个sample(采样)的概念,其实就是 阅读全文
posted @ 2011-01-03 11:05 super119 阅读(5442) 评论(0) 推荐(0)
摘要: 其实build kernel很简单,首先参考kernel源代码目录下的README文件,基本上是这么几步:1. make mrproper -- 注意这一步走过之后,.config会被恢复成默认设置2. make menuconfig -- 在这里面check配置项,决定哪个打开,哪个关闭。哪些driver编译成module,哪些直接编译进内核3. make -- 首先会编译内核,完成后会自动编译modules几个Tips:1. 如果要做交叉编译,只需要定义CROSS_COMPILE环境变量就可以,比如:export CROSS_COMPILE=arm-none-linux-gnueabi-L 阅读全文
posted @ 2011-01-03 11:04 super119 阅读(1149) 评论(0) 推荐(0)