在某些时候我们使用别人的模块或者支持库的时候可能会遇到以下情况:当我们需要在某个任务执行完了以后进行一次刷新(超级列表或者其他的),但是模块/支持库每次遇到设定的操作都会触发一次该子程序。
我们每次被调用的时候并不需要每次都刷新,或者是因为模块/支持库调用的太快导致频繁刷新出现错误【譬如出现莫名其妙的项目】
我的应用场景:使用监视目录模块的时候每次有文件变动都会触发一次以上的子程序(下称“函数”)调用,但是如果每次都刷新超级列表则会造成超级列表里出现某些奇怪的项目(我不知道这是不是易语言本身的问题导致的)。然而并不是每个文件变动我都需要枚举一次文件列表,我只需要在所有文件变动结束后再枚举即可。
然后我想到了一个办法,利用SetTimer时钟重复调用会刷新上次时钟的周期的特性来推迟刷新。也就是说每次被调用一定时间(500毫秒)内如果再次调用就会因为调用了SetTimer时钟而导致这个时钟周期被重置。一定时间(500毫秒)后如果没有操作就不会再次调用这个SetTimer时钟,也就会因为时钟周期到了而被执行。
群众:时钟不是每过一定时间(500毫秒)就会执行一次么?这样岂不是每过一定时间就会刷新一次么?
我的解决办法就是在刷新的时候使用KillTimer来结束这个时钟。这样就不会重复执行了。
如果您发现输入“SetTimer”和“KillTimer”会提示没有这个子程序一类的错误,请在您的源码内粘贴以下dll代码:
看不懂?我来告诉你怎么用!
SetTimer (窗口句柄, 任意数字,时钟周期,子程序指针)
子程序指针就是在子程序名字前面加“&”
KillTimer (窗口句柄, 任意数字)
注意的是这个窗口句柄和任意数字必须和settimer时候输入的完全一样。
补充内容 (2021-1-3 20:57):
之所以不用全局/模块变量,是因为这个子程序并非在程序运行期间仅执行一次。意思是譬如某模块遇到文件改名会调用两次。
补充内容 (2021-1-3 20:58):
但是在这两次调用期间我只想要运行一次。
补充内容 (2021-1-3 21:03):
然而在这个程序关闭前如果在需要调用还是可以用的 |