易语言程序优化专题

上传人:飞*** 文档编号:53622233 上传时间:2018-09-03 格式:PDF 页数:26 大小:37.46KB
返回 下载 相关 举报
易语言程序优化专题_第1页
第1页 / 共26页
易语言程序优化专题_第2页
第2页 / 共26页
易语言程序优化专题_第3页
第3页 / 共26页
易语言程序优化专题_第4页
第4页 / 共26页
易语言程序优化专题_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《易语言程序优化专题》由会员分享,可在线阅读,更多相关《易语言程序优化专题(26页珍藏版)》请在金锄头文库上搜索。

1、易语言程序优化专题易语言程序优化专题* 1、对象的载入与卸载有时我们会发现,用易语言测试运行一些朋友编写的易程序,当退出后, 鼠标指针一直呈箭头及沙漏形状,甚至会死机。原因可能是该程序还没有完全退出,还有一些对象数据留驻内存。对象会占用相当程序的内存及系统资源。作个假设, 如果你在退出程序时不关闭打开的数据库,那么多次打开程序并退出后,可能会引起内存泄漏事件而导致很快死机。故如果我们载入了某个对象,在使用完后要卸载对象释放资源,这是绝对有必要的。有些编程语言甚至在建立变量、数组、常量及窗口对象后,在程序退出时又要销毁它们。但易语言不用, 因为在退出易程序时,它已自动帮你做了这些工作。但有很多对

2、象是无法在程序退出时自动销毁的, 故需要编写代码来卸载这些对象。下面列举一些对象在易语言中怎样载入和销毁的例子。一、易语言内部命令中的对象载入和卸载1、打开数据库与关闭数据库载入数据库用“打开”命令,卸载或销毁数据库用“关闭”或“全部关闭”命令。2、打开文件与关闭文件打开文件用“打开文件”命令,关闭文件用“关闭文件”或“关闭所有文件”命令。3、载入图片与卸载图片有时不一定要在退出程序时卸载被载入的图片,因为如果某图片被载入后未被卸载,在易程序退出时将自动被卸载。但退出时用代码卸载保险一点。二、 API 函数中的对象载入和卸载1、获取设备环境与释放设备环境由 GetDC函数获取的设备环境必须用R

3、eleaseDC函数释放; 由BeginPaint 函数获取的设备环境要用EndPaint 函数释放。2、创建画笔与删除画笔使用画笔之前必须事先定义一个画笔句柄。形式如下:HPEN(hP)然后调用函数GetStockObject 获取 Windows 系统定义的四种画笔例如获取画笔BLACK_PEN的形式如下:hP=GetStockObject( BLACK_PEN )创建画笔后,必须调用SelectObject函数将其选入设备环境。不再使用当前画笔时,需用DeleteObject 删除画笔,以免占内存。3、建立画刷句柄与删除画刷句柄使用画刷需事先定义一个画刷句柄。形式如下:HBRUSH (画

4、刷句柄)然后调用函数GetStockObject获取Windows系统提供的7 种画刷;不使用画刷时,可用DeleteObject 删除画刷,释放内存。4、载入位图与释放位图用 LoadBitMap 加载位图并获得位图的句柄,用DeleteObject 来释放位图或其他对象。5、打开剪贴板与关闭剪贴板打开剪贴板由应用程序调用OpenClipboard 函数完成; 关闭剪贴板由应用程序调用函数CloseClipboard 完成。6、创建计时器与删除计时器SetTimer 用于建立一个计时器,KillTimer 用于删除一个计时器。除上面这些之外,对象的载入和卸载还包括:建立与删除场景、载入与卸载

5、DLL、捕获与释放鼠标、置与重置父窗口、载入与卸载皮肤、分配与释放内存、打开与关闭对话框、创建与释放压缩包、添加与删除提示、注册与撤消热键、创建与销毁线程、播放文件与关闭播放等等很多,其中有一些在易友所编写的易模块、支持库中有所反映。* 2、让你的易程序启动快一点有时是否觉得你的应用程序启动得太慢了?你可以用下面小技巧让你的程序启动起来感觉快一点:在“ _启动窗口 _创建完毕”事件子程序的第一行或其他适当位置加入下面一行代码:_启动窗口 .可视 真点评:易语言在窗口显示前一般先执行“_启动窗口 _创建完毕”事件中的程序,如果你在“_启动窗口 _创建完毕”中加入大量代码或载入庞大的数据库,就可能

6、导致易程序执行代码很久而不显示窗口。 我们在“ _启动窗口 _创建完毕” 事件的第一行强制加入“ _启动窗口 .可视 真”让窗口先显现出来,这样给人感觉程序运行好象就快了点。加上这一句,程序窗口就会先显示出来再说,保险一点。* 3、让易语言编译的程序更小一、引言易语言3.x 独立编译的程序相对于2.x 版本的来说,执行效率提高了,代码也短了。但是还是让人觉得颇为臃肿, 什么程序也不写,编译出来的动辄就400 多 k。那么有什么好的方法吗?请往下看。二、操作方法吴老大在几个月以前发表了易语言支持库开发技术文档里面对易支持库开发有详细的说明。因为支持库是一个dll 文件,那么,也就可以用其它编程工

7、具来编写这个支持库。里面还有有关*.fn? 的后缀名含义的说明:支持库文件名的后缀必须固定为.fnx,其中 x 为一类型字母,目前有意义的后缀有:1、 “ .fne” : 带编辑信息、有运行支持代码的支持库;2、 “ .fnl” : 带编辑信息、无运行支持代码的支持库;3、 “ .fnr” : 不带编辑信息、有运行支持代码的支持库;由于编译时打入文件的支持库后缀名为*.fnr , 而每个支持库均为dll 动态连接库, dll 是 win32 pe 文件,那么我们就可以使用一些已经存在的pe 文件压缩工具对*.fnr 文件进行压缩。 我用的是upx。 QUOTE upx -9 krnln.fnr

8、 upx -9 dp1.fnr upx 这样,打入编译文件的支持库就小很多。再经过编译时的压缩,使目标文件更小。我的一个程序,压缩支持库以前有 400 多 k,现在只有386k。三、期望由于系统核心支持库为必包含的文件,希望吴老大能把这个支持库进行分割,以求更小的编译文件。* 4、从几种判断星期几的方法看编程思路思考下面的判断星期几的多种程序实现方法,从中选择更好的方法,可以开拓我们的编程视野,锻炼编程思维的灵活性。“取星期几” 命令是返回一个值为1 到 7 之间的整数, 表示一个星期中的某一日。星期日为1,星期一为2,依此类推。为什么这样?因为西方的每个礼拜周是从星期日算起的,到星期一、星期

9、二、 、星期六是周末,而西方的礼拜假在周始日,即星期日和星期一放假。易语言的“取星期几”命令其实是沿用西文编程的习惯,所以无法直接获取星期几,所以我们要自制一个函数来完成这项功能。一、流程控制方法:子程序:取星期返回值类型:文本型星期 取星期几(取现行时间() 如果真(星期1) 返回 (“今天是:星期日”) 如果真结束如果真(星期2) 返回 (“今天是:星期一”) 如果真结束如果真(星期 3) 返回 (“今天是:星期二”) 如果真结束如果真(星期 4) 返回 (“今天是:星期三”) 如果真结束如果真(星期 5) 返回 (“今天是:星期四”) 如果真结束如果真(星期6) 返回 (“今天是:星期五

10、”) 如果真结束如果真(星期 7) 返回 (“今天是:星期六”) 如果真结束二、更精简的流程控制命令方法:子程序:取星期返回值类型:文本型局部容器:星期数据类型:整数型星期 取星期几(取现行时间() 判断(星期 1) 返回(“星期日”) 默认返回(“星期” 数值到大写(星期 1, 真) 判断结束三、多项选择方法: 子程序:取星期返回值类型:文本型局部容器:星期数据类型:整数型星期 取星期几(取现行时间() 返回 (多项选择 (星期 , “星期日” , “星期一” , “星期二” , “星期三” , “星期四”, “星期五” , “星期六” ) 以上三种代码中,第一种代码可能是一般人首先想到的,

11、因为各个星期几的性质的一样的,所以很容易就用到“如果真”或多项判断,其中多是受到思维定势的影响。首先想到用这种方法或第二种方法的人应该比较普遍,因为较容易理解。而第二种方法是在第一种方法上的进一步精简。当用第一种代码时,可能你会想, 每增加一个选择项,就要增加一个“如果真”或“判断”,代码行是不是多了一点。于是你想到星期值除了星期日,对应的星期几比它多1,于是你就想到返回(“星期” 数值到大写(星期 1, 真)。也有一部分人首先想到的是这种方法,一般来说头脑比选第一种方法的人更快捷,更容易接近事物本质。选第三种方法的人一般对命令运用较娴熟,思考也更快捷、直击事件本质。所以当你想精简代码时,就可

12、以考虑运用后两种更简便的方法。从上可知,要培养你的编程思路,一要对易语言的语法、命令等各方面都要熟悉,二是要花一点时间来优化、精简你的代码,三是尽量摆脱思维惯性,培养思维的快捷性,扩展编程视野。* 5、从数值运算看程序代码的优化有人说易语言不讲究算法,不是这样的。 易语言的编程原理跟其他编程语言一样,哪有不讲究算法的道理?易语言跟其他编程语言一样都要优化代码、讲究编程效率。 下面试举一例说明在易语言中如何优化代码。我们还在读书的时候,常会接触一些数学智力题,比如当最大数为n 时计算下面算式的值:1-2+3-4+5-6+7+n 我相信没有哪个同学会这样计算:先算 1-2 的结果, 再算 1-2+

13、3 的结果、 、 一步一步这样算下去。这种计算方法很慢,太笨了。 有些计算能力比较强的同学可能会较快找到好的方法得到正确的结果。编程的运算原理跟我们数学的计算方法差不多,一般来说, 在数学中好的运算方法用到编程中也是好的, 在数学中不好的方法在编程中也会不好。下面我们就用编程的方法计算上面算式的值来说明这一点,我们编制一个子程序 运算最大值 来完成这项功能。可能一般人首先想到的是下面这种方法:子程序:运算最大值返回值类型:长整数型参数:最大值数据类型:长整数型局部容器:临时值数据类型:长整数型局部容器:循环值数据类型:整数型局部容器:标记值数据类型:整数型临时值 0 标记值 1 如果真(最大值

14、 0) 信息框(“错误 : 最大值必须 0 ”, 0, ) 结束() 如果真结束计次循环首(最大值 , 循环值 ) 临时值 临时值 标记值 循环值标记值 -1 标记值计次循环尾() 返回(临时值 ) 上面的步骤肯定可以得到正确的答案。但是只要你测试一下,就会发现:当最大值为很大时,程序的执行速度非常慢。在程序开发中,程序的运行效率很重要,能让CPU 少执行一条指令都是好的, 让我们看看这个程序还有什么可以修改的地方,把程序优化一下。我们修改为下面的代码看看:子程序:运算最大值返回值类型:长整数型参数:最大值数据类型:长整数型局部容器:临时值数据类型:长整数型局部容器:循环值数据类型:整数型局部

15、容器:标记值数据类型:整数型临时值 0 标记值 1 循环值 1 如果真(最大值 0) 信息框(“错误:最大值必须 0 ”, 0, ) 结束() 如果真结束判断循环首(标记值 最大值 ) 临时值 临时值 循环值循环值 循环值如果(循环值 0) 循环值 循环值 1 否则循环值 循环值 1 如果结束标记值 标记值 1 判断循环尾() 返回(临时值 ) 经测试上面代码的执行速度比第一种代码快了一点点,原因是加法运算会比乘法运算快,而代价仅仅是增加了一个整数型变量。但是当最大值为很大时,运算速度仍然很慢。也就是说这个程序仍然不能达到要求,还应该有更优的方案。更优的方案是:子程序:运算最大值返回值类型:长整数型参数:最大值数据类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号