开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: 鲁凯啸
收起左侧

[易源码分享] 易语言程序优化专题

[复制链接]
结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:21:12 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸   9、如何编写高质量的易语言代码? 下面参考了尘虚缘的意见作了一些修改。








什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源。程序的时间效率是指运行速度,空间效率是指程序占用内存或者外存的状况。另外程序的效率我们也可以分为全局效率和局部效率。全局效率是指站在整个系统的角度上考虑的效率,局部效率是指站在模块或函数角度上考虑的效率。

1. 使用整数和长整数

  提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将短整数型、小数型和双精度小数型的变量替换为整数(Integer)或长整数(Long)类型的变量,因为易语言处理整数和长整数的能力远远高于处理其它几种数据类型。

  在大多数情况下,程序员选择使用小数型或双精度小数型的原因是因为它们能够保存小数。但是小数也可以保存在整数类型的变量中。例如程序中约定有三位小数,那么只需要将保存在整数型变量中的数值除以1000就可以得到结果。根据我的经验,使用整数和长整数替代短整数型、小数型和双精度小数型后,代码的运行速度可以提高将近10倍。 但是我们也不要老是强调使用使用整数和长整数,因为在程序中数据类型的定义还牵涉一个关键的问题,就是数据的安全,频繁而无规范地定义 数据类型会使算法出现漏洞,是数据的安全和临界判断有问题.对财务和工程计算而言,小数点的精度是很敏感的数据,只能用双精度数据来规范.另外, 换成整型也会导致程序可读性急剧下降.

2. 避免使用通用型数据

  通用型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用通用型变量的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。

3. 尽量避免使用属性

  在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的:

容器名: 数值 类型:整数型
容器名: 容器 类型:整数型

计次循环首(7,容器)
文本1.内容 = 文本1.内容 + #换行符 + 到文本((数值×容器))
计次循环尾()

  下面这段代码的执行速度是上面代码的20倍。

容器名: 数值 类型:整数型
容器名: 容器 类型:整数型
容器名: 文本 类型:文本型

文本 = 文本1.内容

计次循环首(7,容器)
文本 = 文本 + #换行符 + 到文本((数值×容器))
计次循环尾()

文本1.内容 = 文本

另外要注意,这个涉及一个编程思路, 用属性当变量的作法大多数情况可以简化算法。所以有时候也不能一味强调用变量代替属性。

6. 避免调用很短的子程序

  调用只有几行代码的子程序也是不经济的--调用子程序所花费的时间或许比执行子程序中的代码需要更长的时间。在这种情况下,你可以把子程序中的代码拷贝到原来调用子程序的地方。 但是有时候小的子程序可能会被调用很多次而不是只有两三次,这时就应该调用它。

7. 减少对子对象的引用

  在易语言中,通过使用.来实现对象的引用。例如: 窗口1.编辑框1.内容

  在上面的例子中,程序引用了两个对象:窗口1和编辑框1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。我的“多媒体模块”就有这个缺点。

8. 检查文本型数据是否为空

  大多数易语言用户在检查文本型数据是否为空时会使用下面的方法: 如果 (文本1.内容 = "" ) 注释: 执行操作 结束如果

  很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法: 如果 (到数值(文本1.内容) = 0 ) 注释: 执行操作 结束如果 另一个不同的意见是:问题在于当文本字串为 "ABC"之类的非数值型时, 到数值("ABC")=0并不表示为空。文本比较的效率并不低,在底层算法中,一般会直接比较长度才会继续比较内容。

9. 使用数组,而不是多个变量

  当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在易语言中,数组是最高效的数据结构之一。

10. 尽量使用动态数组,而不是静态数组

  使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。

11. 销毁对象

  无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多用户对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:关闭数据库:关闭(数据库名称)、全部关闭(),关闭打开(播放)的文件,关闭载入的图片等。 中止程序执行时应该要关闭打开的文件(包括数据库文件、图片文件等),但是窗口销毁对销毁窗口及窗口单元来说是自动的,已足够做释放用,在窗口内最好不要随意销毁窗口单元,可能会导致程序运行中的潜在的单元数据访问而崩溃.只有在图形buffer情况才需要经常销毁。

12. 尽量使用内部子程序,减少易模块的数量 因为从易语言连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用接口函数的时候,都会浪费大量的系统资源。 另外只有在易模块中的接口函数或变量被调用时,易语言才将易模块加载到内存中;当易语言应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,易语言就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,易语言会进行多次加载操作,代码的效率会降低。

13. 使用对象数组

  当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个图片框,每个图片框都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个图片框,不过这一次使用对象数组,运行程序,你可以注意到两个程序加载时间上的差别。 也有人认为两者从逻辑上看效率应该差不多。

14. 使用窗口单元“移动”方法

  在改变对象的位置时,有些用户喜欢使用“宽度”、“高度”、“顶边”和“左边”属性。例如: 按钮1.宽度 = 100 按钮1.高度 = 100 按钮1.顶边 = 0 按钮1.左边 = 0

  实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法: 按钮1.移动(0,0,100,100)

15. 减少图片的使用

  图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。 但是如果为了优化程序界面,使用图形换来的好处可能远胜节约下的资源,否则就不会有XP,也不会有游戏的进步了。

16. 编译优化 易语言的程序编译有三个选项:“编译”、“独立编译”、“编译生成安装软件”。优先使用的次序应该是“编译生成安装软件”、“编译”、“独立编译”,因为“独立编译”会将易语言系统中所有的支持库都编译进去,而“编译生成安装软件”只选择程序中必要的支持库编译。要脱离易语言环境也可以运行,就不要使用“编译”而应用“编译生成安装软件”或“独立编译”。 总结:执行效率和程序可读性永远是对矛盾 ,两者应该通盘考虑;资源占用和程序易用性永远是对矛盾,两者也应该通盘考虑。基于此,下面探讨一些提高程序的效率的规则。

【规则1】不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率。

【规则2】以提高程序的全局效率为主,提高局部效率为辅。

【规则3】在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。

【规则4】先优化数据结构和算法,再优化执行代码。先考虑某功能是否可以用函数(命令)来实现,如果找不到这样的函数,再考虑用其他代码实现。

【规则5】有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。

【规则6】不要在什么时候都只追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:23:09 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸 10、试探易语言的命名规则


     姑且将我所推荐的易程序命名方法称为"bb88"法,该命名规则的主要思想是"在变量和函数名中加入后缀以增进人们对程序的理解"。我认为这种命名方式适用于汉语编程,故跟英文编程的命名方式有所不同。例如对象可以命名为“有意义的对象名+对象类型”,变量可以命名为“有意义的变量名+变量类型”,比如按钮可以命名为“编辑钮”、“删除钮”、“打开钮”之类;变量可以命名为“循环容器”、“长度文本”、“结果数值”之类。“有意义的对象名”、“有意义的变量名”主要是就对象或变量的功能而言,比如某标签的作用是提示操作方法,那我们就可以将该标签起名为“提示签”,又如某个变量的作用是记录循环的次数,那我们可以将其命名为“循环容器”、“次数”、“循环次数”、“循环变量”之类。 据考察,没有一种命名规则可以让所有的用户赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是"成败悠关"的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数用户满意的命名规则,并在项目中贯彻实施。另外说一句题外话,其他编程语言一般把编程者称为程序员,而易语言编程者我们一般称为“易语言用户”、“编程用户”、“用户”之类为好。 本贴围绕探讨易程序命名的共性规则而展开,本贴论述的共性规则是被大多数用户所采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则。

【规则1】标识符应当直观且可以拼读,可望文知意,不必进行"解码"。 对于汉语编程来说,与英文编程相反,标识符最好采用中文词语或其组合,便于记忆和阅读。尽量不使用英文或汉语拼音来命名。程序中的中文词语一般不会太复杂,用词应当准确。例如不要把“当前值”写成“目前值”。

【规则2】标识符的长度应当符合"长度小、信息少"的原则。 在某些情况下规定名字不准超过6个汉字,但一般情况下可以不受此限制。一般来说,长名字能更好地表达含义,所以子程序名、命令名、变量名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名“最小值”就比“跟最小值一样的数值”好用。单字符的名字也是有用的,常见的如“一”、“二”、“三”等,它们通常可用作子程序内的局部变量。

【规则3】程序中不要出现仅靠大小写区分的相似的标识符。例如:变量名: x 变量名: X ※ 变量x 与 X 容易混淆子程序名:foo 子程序名: FOO ※ 子程序foo 与FOO容易混淆

【规则4】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。

【规则5】变量的名字应当使用"名词"或"形容词+名词"或“动词+名词”等。例如:“值”、“老值”、“新值”。

【规则6】用正确的反义词组命名具有互斥意义的变量或相反动作的子程序、命令等。例如:“最大值”与“最小值”、“置长度()”与“取长度()”等。

【建议7】尽量避免名字中出现数字编号,如“值1”、“值2”、“编辑框1”、“编辑框2”等,除非逻辑上的确需要编号。这是为了防止用户偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。

【建议8】全局变量加前缀“全_"或"全局"或"全"或“全—”或“q”(quan)。如“全-播放中”或“Q播放中”,这样在编程中就不会混淆全部变量与局部变量、程序集变量的区别,易于阅读和排查错误。
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:24:09 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸 11、关于流程控制命令的应用思路


  我们用下面两种代码来实现移动文件然后退出程序窗口,如果将要移动的文件就在要移动到的文件夹下,就不移动该文件,怎么做呢?试比较下面两种实现此功能的代码有什么不同: 代码一:

如果真 (命令参数 [2] = “3”)
如果真 (文件名 ≠ 录象路径 + 文件名3 + 后缀名)
移动文件 (文件名, 录象路径 + 文件名3 + 后缀名)
如果真结束
销毁 ()
如果真结束


代码二:

如果真 (命令参数 [2] = “3” 且 文件名 ≠ 录象路径 + “\” + 文件名3 + 后缀名)
移动文件 (文件名, 录象路径 + “\” + 文件名3 + 后缀名)
销毁 ()
如果真结束


表面上看上面两种代码都能达到目的,但是这两种代码真的可以互换吗?其实只要我们看两者的流程线就能发现它们之间的差别,代码一无论原文件在哪一个位置,移动后都退出程序窗口;而代码二则是如果文件在要移动到的目录下,就不退出程序窗口,假如你想移动后就退出程序窗口,代码二就不能达到目的。所以假如我们用代码二达不到目的,就要变换一下思路,稍为调整一下代码及流程线看看。 为了加深印象,再比较下面两个代码:

代码一:

移动读写位置 (文件号, , 取文件长度 (文件号)- 11) 如果 (取发音数目 (读入文本 (文件号, 11)) < 1)
返回 ()
否则
移到文件尾 (文件号)
判断循环首 (读入文本 (文件号, 11) ≠ “#文本分割符”)
读写位置 = 读写位置 - 1
移动读写位置 (文件号, , 读写位置)
判断循环尾 ()

代码二:

移到文件尾 (文件号)
判断循环首 (读入文本 (文件号, 11) ≠ “#文本分割符” 且 读入文本 (文件号, 11)) ≥ 1)
读写位置 = 读写位置 - 1
移动读写位置 (文件号, , 读写位置)
判断循环尾 ()


上面代码要实现的功能是当读入文件最后11字节的数据不包含文本型数据,且找到分割文本时,就停止向前移动读写位置。哪一种代码才适合呢?我们很可能首先想到第二种代码,因为流程线简单。但是如果运用的是第二种代码,你就会发现当读入的不是文本型数据时,读写指针仍然向前移动。原因是什么?原来是子程序运行了两次“读入文本 (文件号, 11) ”,所以第二次运行该代码前指针已在文件尾,无法再读入11字节数据。怎么办?我们可将“且”分解,即将多条件单流程控制转化为多流程单条件控制,即运用代码二。


总结:当我们运用较复杂的流程控制命令出现问题时,可多查看它的流程线,尝试稍为改变一下代码。 习题:还是上面的例子,当要实现每读入11字节的数据中找不到文本数据,且找到分割文本时,就不向前移动读写位置,怎样做到?
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:25:32 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸   12、易语言的多线程机制初探


一、关于多线程冲突问题。
3.6版开始增加了多线程支持库,提供对多线程的支持,并通过实现进入许可证机制以避免多线程冲突。 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。 多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度,同步等问题,将在下面探讨。 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。 多线程也有它不利的一面。任何时候某个应用程序使用的线程多于一个时,如果多个线程在同一时刻试图使用相同的数据或资源,可能出现麻烦。这种情况一旦出现,程序将变得非常复杂并且难以调试。

  更糟的是多线程代码经常在最初开发时运行良好,在形成产品时却往往失败,原因在于有未被发现的多个线程与相同的数据或资源相互作用的情况。这使得多线程编程非常危险。 因此,在编程时需要考虑在多个线程访问同一资源时产生冲突的问题:当一个线程正在访问一个进程对象时,另一个线程要改变该对象,这时可能会产生错误的结果。所以,程序员编程时要解决这种冲突。

  最简单的避免线程冲突的的方法是使线程之间永远不与相同的数据或资源交互。但这不一定可行,对任何多线程程序来说,避免或最小化共享数据或资源应作为一个目标。 二、下面介绍一下在Win32 基础上用API函数进行多线程编程的过程。

  1、用Win32函数创建和中止线程

  Win32函数库中提供了多线程控制的操作函数,包括创建线程、中止线程、建立互斥区等。首先,在应用程序的主线程或者其它活动线程的适当地方创建新的线程。创建线程的函数如下:

  HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );

  其中,参数lpThreadAttributes 指定了线程的安全属性,在Windows 95中被忽略;dwStackSize 指定了线程的堆栈深度;lpStartAddress 指定了线程的起始地址,一般情况为下面的原型函数:DWORD WINAPI ThreadFunc( LPVOID );lpParameter指定了线程执行时传送给线程的32位参数,即上面函数的参数;dwCreationFlags指定了线程创建的特性; lpThreadId 指向一个DWORD变量,可返回线程ID值。

  如果创建成功则返回线程的句柄,否则返回NULL。

  创建了新的线程后,则该线程就开始启动执行了。如果在dwCreationFlags中用了CREATE_SUSPENDED特性,那么线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程,在这个过程中可以调用函数:

  BOOL SetThreadPriority( HANDLE hThread, int nPriority);

  来设置线程的优先权。

  当线程的函数返回后,线程自动中止。如果在线程的执行过程中中止的话,则可调用函数:

  VOID ExitThread( DWORD dwExitCode);

  如果在线程的外面中止线程的话,则可调用下面的函数:

  BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );

  但应注意:该函数可能会引起系统不稳定,而且线程所占用的资源也不释放。因此,一般情况下,建议不要使用该函数。

  如果要中止的线程是进程内的最后一个线程,则在线程被中止后相应的进程也应中止。

  2、用Win32函数控制线程对共享资源的访问

  在线程体内,如果该线程完全独立,与其它的线程没有数据存取等资源操作上的冲突,则可按照通常单线程的方法进行编程。但是,在多线程处理时情况常常不是这样,线程之间经常要同时访问一些资源。例如,一个线程负责公式计算,另一个线程负责结果的显示,两个线程都要访问同一个结果变量。这时如果不进行冲突控制的话,则很可能显示的是不正确的结果。

  对共享资源进行访问引起冲突是不可避免的,但我们可用以下办法来进行操作控制:

  (1) 通过设置线程的互斥体对象,在可能冲突的地方进行同步控制。

  首先,建立互斥体对象,得到句柄:

  HANDLE CreateMutex( );

  然后,在线程可能冲突区域的开始(即访问共享资源之前),调用WaitForSingleObject将句柄传给函数,请求占用互斥体对象:

  dwWaitResult = WaitForSingleObject(hMutex, 5000L);

  共享资源访问完后,释放对互斥体对象的占用:

  ReleaseMutex(hMutex);

  互斥体对象在同一时刻只能被一个线程占用。当互斥体对象被一个线程占用时,若有另一线程想占用它,则必须等到前一线程释放后才能成功。

  (2) 设置信号:在操作共享资源前,打开信号;完成操作后,关闭信号。这类似于互斥体对象的处理。

  首先,创建信号对象:

  HANDLE CreateSemaphore( );

  或者打开一个信号对象:

  HANDLE OpenSemaphore( );

  然后,在线程的访问共享资源之前调用WaitForSingleObject。

  共享资源访问完后,释放对信号对象的占用:

  ReleaseSemaphore();

  信号对象允许同时对多个线程共享资源的访问,在创建对象时指定最大可同时访问的线程数。当一个线程申请访问成功后,信号对象中的计数器减一;调用ReleaseSemaphore函数后,信号对象中的计数器加一。其中,计数器值大于等于0,小于等于创建时指定的最大值。利用信号对象,我们不仅可以控制共享资源的访问,还可以在应用的初始化时候使用。假定一个应用在创建一个信号对象时,将其计数器的初始值设为0,这样就阻塞了其它线程,保护了资源。待初始化完成后,调用ReleaseSemaphore函数将其计数器增加至最大值,进行正常的存取访问 三、下面介绍易语言的多线程编程方法。 通过研究易语言附带的两个多线程例程,总结如下:

(一)、先看易语言对自己的多程机制的解释:
1、创建进入许可证:创建并返回一个进入许可证数值,此许可证值用作进入程序中的指定许可代码区,以避免多线程冲突。
2、删除进入许可证:删除由“创建进入许可证”命令所创建返回的进入许可证,以释放系统资源。
3、启动线程:创建并启动一条线程,可重复使用以创建多条线程。
4、进入许可区:根据已经创建的许可证进入指定许可代码区,在此线程未退出之前,其它线程如要通过同一个进入许可证进入该许可代码区则必须先等待此线程退出许可代码区,从而保证了指定许可代码区在任何时候都只能有一条线程进入并执行。
5、退出许可区:指示当前线程将退出许可代码区,并允许其它使用同一进入许可证的线程进入此许可代码区。

(二)、易语言的多线程编程过程大约如下:
1、先用“创建进入许可证”命令为一个线程进入一个指定的许可代码区建立一个许可证。
2、用“启动线程”命令创建并启动一条线程,以运行一个线程的子程序。
3、在一个线程子程序里用“进入许可区”使该线程占用一个许可代码区,并锁定该代码区不让其他线程进入,并锁定其他线程运行,以避免线程冲突。
4、使用“退出许可区”解锁该许可代码区,以便让其他线程进入。若想使多个线程同时运行,我们可以为每个线程建立一个进入许可证,进入许可区与退出许可区连着进行使多个线程同步运行。
5、当退出程序时,要删除进入许可证以释放系统资源。

(三)、下面的示例代码同时运行两个线程,一个是连续随机画圆,一个是连续随机画矩形:

窗口程序集:窗口程序集1 程序集变量:进入许可证1 数据类型:整数型

程序集变量:画圆判断 数据类型:逻辑型
程序集变量:画矩形判断 数据类型:逻辑型
程序集变量:进入许可证2 数据类型:整数型

子程序:_按钮1_被单击 ※ 备注:如果按钮1的标题为“停止画圆”时就开始画圆(画圆判断 = 假),否则如果按钮1的标题为“开始画圆”时就停止画圆(画圆判断 = 真)。 画圆判断 = 取反 (画圆判断)


判断 (画圆判断 = 真)
如果 (进入许可证1 ≠ 0)
如果真 (启动线程 (&画圆线程) = 真)
按钮1.标题 = “停止画圆”
如果真结束
否则
信息框 (“创建进入许可证 失败”, 0, )
如果结束
默认
按钮1.标题 = “开始画圆”
判断结束

子程序:画圆线程 判断循环首 (画圆判断 = 真)
置随机数种子 ()
画板1.刷子颜色 = 取颜色值 (取随机数 (0, 255), 取随机数 (0, 255), 取随机数 (0, 255))
画板1.画笔颜色 = 取颜色值 (取随机数 (0, 255), 取随机数 (0, 255), 取随机数 (0, 255))
画板1.画椭圆 (取随机数 (1, 画板1.宽度), 取随机数 (1, 画板1.高度), 取随机数 (1, 画板1.宽度), 取随机数 (1, 画板1.高度))
进入许可区 (进入许可证1)
退出许可区 (进入许可证1)
延时 (500)
判断循环尾 ()

子程序:__启动窗口_创建完毕 进入许可证1 = 创建进入许可证 ()
进入许可证2 = 创建进入许可证 ()

子程序:__启动窗口_将被销毁 删除进入许可证 (进入许可证1)
删除进入许可证 (进入许可证2)

子程序:_按钮2_被单击 画矩形判断 = 取反 (画矩形判断)
判断 (画矩形判断 = 真)
如果 (进入许可证2 ≠ 0)
如果真 (启动线程 (&画矩形线程) = 真)
按钮2.标题 = “停止画矩形”
如果真结束
否则
信息框 (“创建进入许可证 失败”, 0, )
如果结束
默认
按钮2.标题 = “开始画矩形”
判断结束

子程序:画矩形线程 判断循环首 (画矩形判断 = 真)
置随机数种子 ()
画板2.刷子颜色 = 取颜色值 (取随机数 (0, 255), 取随机数 (0, 255), 取随机数 (0, 255))
画板2.画笔颜色 = 取颜色值 (取随机数 (0, 255), 取随机数 (0, 255), 取随机数 (0, 255))
画板2.画矩形 (取随机数 (1, 画板2.宽度), 取随机数 (1, 画板2.高度), 取随机数 (1, 画板2.宽度), 取随机数 (1, 画板2.高度))
进入许可区 (进入许可证2)
退出许可区 (进入许可证2)
延时 (500)
判断循环尾 ()
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:26:43 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸   13、加快表格的读入速度




有人说易语言表格读入数据的速度慢,其实是代码的问题。比如可以采用部分载入的方法,来加快速度和尽量少的占用资源,但这不是根本解决办法。最好的办法就是在向表格填充数据前先把数据源卸掉!这样可以避免每填充一次系统即自动通知处理者一次。在载入数据前先:表格1。数据源=“” , 载入数据后:表格1。数据源=“数据库1”, 这样就飞快了。

示例代码:

子程序:__启动窗口_创建完毕

局部容器:文件内容 数据类型:文本型
局部容器:行文本 数据类型:文本型 数组:0
局部容器:列文本 数据类型:文本型 数组:0
局部容器:索引 数据类型:整数型
局部容器:索引2 数据类型:整数型 文件内容 = 到文本 (读入文件 (“txt.txt”))


如果真 (文件内容 = “”)
信息框 (“先把TXT.TXT文件放到当前目录”, 0, )
销毁 ()
如果真结束
行文本 = 分割文本 (文件内容, #换行符, )
表格1.数据源 = “”
计次循环首 (取数组成员数 (行文本), 索引)
列文本 = 分割文本 (行文本 [索引], “ ”, )
计次循环首 (取数组成员数 (列文本), 索引2)
数据源1.置文本 (索引, 索引2, 列文本 [索引2])
计次循环尾 ()
计次循环尾 ()
表格1.数据源 = “数据源1”


就是说先断开表格与数据源的联系,然后接上。好,大家以后记得要这样处理了。
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2009-12-26 10:27:34 | 显示全部楼层   山西省吕梁市
回复 1# 鲁凯啸   14、缩小应用程序所需内存的几种方法:




(转贴改编自VB优化文章)



以下技术可缩小代码大小:

  1.减小加载窗体数目 每一个加载的窗体,无论是与否,都要占用一定数量的内存(其数量随着窗体上控件的类型和数量,以及窗体上位图的大小等不同而有所改变)。所以,为了节约内存,我们只在需要时才加载窗体,不需要时卸载窗体(而不是隐藏窗体)。记住:任何对窗体的引用,和对窗体变量的引用,都会导致易语言程序加载该窗体。

  易语言用“销毁”方法卸载窗体,如: 窗口1.销毁()

2.减少控件数目 设计应用程序时,窗体应尽量少用控件。实际的限制取决于控件的类型和系统。实际上,含有大量控件的窗体将运行缓慢。有可能的话考虑用复制控件的方法。

  3.用标签代替编辑框 标签控件占用的Windows资源比编辑框少,因此,在可能的情况下,应使用标签代替编辑框。

  例如,当窗体上需要一个隐藏的控件保存文本时,使用标签应该更为有效。如果是需要大量文本域的数据输入窗体,也可以用这种技术优化。

  4.保持数据在磁盘文件和资源中,并且只在最需要时才加载 在设计中,直接放入应用程序的数据(像属性或代码中的文字字符串和数值)将增加运行时程序占用的内存。运行时从磁盘文件和资源中加载数据可以减少内存占用。这对大的位图和字符串特别有价值。

  5.考虑替换通用数据类型 通用数据使用极其灵活,但占用内存大。所以,我们应考虑用其他数据类型代替通用变量,特别是替代通用变量数组。

  6.消除死代码和无用的变量,尽量不用全局变量。可在代码编辑区用查找命令查找删除无用的代码和变量。
回复 支持 反对

使用道具 举报

发表于 2009-12-26 10:43:16 | 显示全部楼层   辽宁省盘锦市
顶死老鲁,很牛的帖子。。。
回复 支持 反对

使用道具 举报

结帖率:95% (80/84)

签到天数: 8 天

发表于 2011-8-14 23:49:06 | 显示全部楼层   黑龙江省大庆市
支持支持。      
回复 支持 反对

使用道具 举报

结帖率:52% (29/56)
发表于 2012-11-18 02:23:09 | 显示全部楼层   福建省宁德市
不错不错值得看
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2013-4-29 23:27:29 | 显示全部楼层   吉林省延边朝鲜族自治州
很不错,值得参考~

点评

  河北省唐山市  发表于 2014-8-13 07:37
  河北省唐山市  发表于 2014-8-13 07:36
  河北省唐山市  发表于 2014-8-13 07:36
  河北省唐山市  发表于 2014-8-13 07:35
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表