如题,经常听到有些初学者抱怨这个问题。
我分析了下,这个不能愿bernard把RTGUI设计的太绕了。主要问题应该还是出在初学者自己身上。最好的学习方法就是仔细的读代码。当遇到弄不明白的地方时,可以暂时放一放,当通篇读个大概时,一般的疑问也就解决了。尤其关于GUI,很多问题都是逻辑上的,并不是语法上的。当通篇读个3~4遍时,应该可以熟练地使用RTGUI了。达到这个程度,也仅仅可以正确使用很多函数,要想能够修改代码,在很多地方还要下功夫。一般理解不深的地方,读个10遍以上,其含义一般就自动明白了。
上面说的不是主要原因。对于很多初学者学RTGUI难,这与学校里的教学C语言的方法应该有很大关系。一般学习C语言时,都是按部就班的编程,一个一个函数的调用。理解能力强的,则对指针掌握的熟练,能够灵活的用指针。否则使用指针少,甚至很多学生都不会用指针,整个程序都是用函数拼起来的。这里面的区别就大了。很多西方院校学一门语言,就是去分析一个OS的源代码,中国的程序教学估计达不到这个层次。
因为上述的原因,所以造成初学者看到各种指针调用,就迷糊了。掌握指针的方法只能是多学,多试验。其实这也是体现bernard使用C语言功力深厚的地方。bernard为整个RTGUI乃至RTT设计了一个系统的框架,就像多条锁链一样,在每条锁链上都预留了相应的接口。这种方法在一些OS源码中是很常见的。这些接口实际上就是一些钩子,与我们常说的钩子函数的钩子是一个意思。这些钩子不钩函数也可以保证程序正常执行,当钩上了某个函数后,就可以去执行一种功能。所以我们会看到RTGUI中有很多空着的钩子。用户需要做的就是去编写这些钩子函数,然后配置好它就可以了。当然,在编写这些钩子函数之前,你应该已经通篇读过了几遍代码。否则你不能确定你写的函数被调用后,会不会引起与其他函数的冲突,这也是很多人修改代码时,频繁遭遇死机的原因。
讲这些,希望对一些初学者有点帮助。记住,最有效的学习方法,就是读代码,很多老手都是这么走过来的。
我觉得RTGUI相比UCGUI框架清晰多了,对于有一定基础的人是比较好理解的。
RTT和RTGUI确实用了比较多的指针和指针函数,但这也是它灵活的地方。初学者如果能消化下,肯定会在编程思想和水平上有一个很大的提高。
我并不同意一楼的说法,你懂什么叫面向对象设计吗?你知道为什么要有面向对象设计吗?面向对像设计的目的就是为了节省时间,提高效率,你用的windows或者linux是不是还要求你一遍又一遍的去看代码啊?你用VC的时候是不是每个控件都要去研究一下它是怎么实现的啊?你老板是不是让你在上班时间去研究linux源代码啊?你老板能不能给你10年的时间去做一个项目啊?
做项目不比做学术研究,做项目看重的是目的,做学术研究看的是过程,一个项目用什么语言做,用什么系统,用什么硬件平台等等,都有很多选择,但这些都不重要,重要的是什么样的选择能让我尽快的省时,省力,省钱同时又稳定的达到我想要的目的。这就是做老板的最高宗旨,而工程师存在的价值就是帮老板去实现这个宗旨。我为什么要用RTGUI? 他相对其它GUI有什么优势,让我省时了?省心了?还是省钱了?我是要拿他去做产品的,不是要拿他来玩的,玩那是学生做的事情。我是要一个拿来就能用的,不需要我花太多精力,想用什么就用什么,不用什么就减少程序空间的东西,我不是学生,如果还要研究半天,我用你干麻?原理都很简单,我自己写几个控件凑合调用一下不就完了?关键要用GUI就是为了节约时间,提高效率。
从我个人的角度,RT-thread以及GUI还有很大完善空间,但几个月了,发布版本还是0.3.1,我知道你们主要精力放在0.4.0上,但我建议不妨先把0.3.x这个版本的易用性做到极至了再去考虑那些花哨的功能,做产品不像做学习板,今天我加个彩色屏,明天我放个SD卡,后天我放个NAND flash,还不爽我放个以太网口在上面,做产品讲究的是能省就省,能用灰色屏我为什么放个彩屏,CPU 128K ROM可以实现的功能我为什么要放512? RAM 10K够了我为什么还要扩展1M? 128K的spi flash够了我为什么还要放个SD卡上去?OK我想将RT-thread和RTGUI做个裁减时,问题来了,一大堆盘根错节的函数依赖关系,这个文件不放不行,那个宏定义开关不打开不行,做软件最讲究的就是“高内聚,低耦合”,虽然rt-thread的功能比ucos多了很多,但人家每个功能性的宏开关,绝不会影响到其它功能,你要那么多功能有什么用?原本还想支持一下国内的开源软件的,但这个现状你让我如何决定?
RTT本身是用C语言写的,不可能实现真正的面向对象编程。在这个问题上推敲的意义不大。RTT的学习者中有很大的比例是在校学生。这篇帖子的目的是告诉这些学生在学习RTT时多掌握下C语言中指针的用法。当然使用者中应该有很多都是有一定开发经验的。楼上提到问题确实存在,不过对于熟手来说都是很容易解决的问题,网上有许多教新手如何移植RTT的例子。目前为止还没有哪一款嵌入式GUI能够拿来就用的,多少都要做些修改。想要实现全面的面向对象编程,OS就需要做的很完善,需要消耗非常庞大的资源。这个条件在大多数嵌入式设备中并不具备。前楼的朋友不防研究下GTK+,面向对象是需要编译器支持的。
小弟也是不才,GUI的代码看了虽然有段时间,但不免很多东西都是都是连猜带蒙的边做实验边验证想法,不过老实说,如果笔者能提供一个大致的数据流关系,或者其中的一些继承和数据传递关系,对初学者还是会有很大的帮助的!
小弟也是不才,GUI的代码看了虽然有段时间,但不免很多东西都是都是连猜带蒙的边做实验边验证想法,不过老实说,如果笔者能提供一个大致的数据流关系,或者其中的一些继承和数据传递关系,对初学者还是会有很大的帮助的!
正如longxiguang说的那样,我也是一个为老板打工的人,没有太多的时间写文档.我在这里想提醒朋友们都忽略的一个问题:在嵌入式行业,没有多少是拿来就可以用的东西,很多知识都要亲自去钻研一下,起码也要知道如何使用拿来的东西.鲁迅先生曾经提到一个”拿来”主意,提倡去其糟粕,取其精华.但是在这背后是国人无数的努力和辛苦的汗水,再简单的事物也是要系统的研究一下才能变成自己的东西.
说到windows上的编程,win程序员没有多少人能够了解windows内部是如何运作的,除了微软自己的工程师.而很多使用linux的人,也会辛苦的去研究linux内核代码,即使再有经验的linux工程师也不敢说自己对linux都懂了.这些都是微机平台上的编程环境.对于程序员来说不需要太深入了解系统也能够编写代码.
在嵌入式方面的情况则不同.鉴于很多初学者使用RTGUI时遇到的问题,写了这些东西。
RTGUI是一个很小巧的嵌入式GUI平台。如果您很了解GUI方面的知识,并且能够很熟练的使用C语言编程,那么您可以很轻松愉快的使用RTGUI。如果在这方面是一个新手,使用RTGUI时可能会遇到一些问题,甚至会带来很多的烦恼。就像很多朋友抱怨的那样,RTGUI并不能够拿来就用,在使用之前有必要作一个系统的学习。
GUI是一组管理人机操作界面的程序。
RTGUI在RT-Thread中也是作为一个或几个线程来运行的。所以要很好的使用RTGUI,需要在RT-Thread平台上给它编写代码。
首先要了解,我们需要GUI给我们带来哪些功能。对于一般的产品,GUI程序一般都会提供按键输入、鼠标输入基本事件处理,此外还会提供字体管理、图像管理、多媒体管理、控件管理、窗口管理等功能。
GUI为了管理这些功能,让用户使用过程中不用关心具体的操作细节就可以使用它们,一般都会建立一种机制对这些行为进行一定的封装。这种操作模式就是GUI的透明访问模式。而这种封装机制我们称它为GUI架构。
先来看一个透明访问的例子。我们在一个“按钮”控件上点击一下鼠标或触摸屏,按钮控件马上作出了相应,边框编程凹下去的样子,并且绘制了一个焦点框。这个过程既是透明访问。
当一个应用程序员给按钮控件写“单击”事件时,只需要调用标准的按钮点击API即可以轻松的完成这个功能。从这个角度来看,使用GUI编程是很简单的。这也是对象编程的核心思想。
但是,如果你想站在系统程序员的角度去看这个例子,就不能简单视之了。
因为对于应用程序员来说是以一个使用者的身份应用某个模块功能,而对于系统程序员来说,身份则变成了模块的提供者。使用者与提供者的区别是显而易见的。就如上面的例子。使用者往往不必关心“点击”动作如何反馈到目标按钮控件上去,这恰恰就是提供者需要关心的问题。
在PC领域。一般人都是一个应用程序员的身份,操作系统已经提供了完善的系统编程接口和易用的API接口函数,人们可以使用这些接口函数快速的开发应用程序。
嵌入式领域的程序员不可能像PC程序员那样舒坦。当您希望在自己的平台上跑操作系统时,这种境况尤为突出。所以如果你已经决定了将未来的人生投入到嵌入式领域之中,那么在你的心里应该已经有了这种觉悟。或者你准备觉悟了,嵌入式平台上没有PC平台那么多的资源供程序员挥霍,所以没有PC程序员活的潇洒滋润。嵌入式平台必须由程序员搞定一切。