开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 6556|回复: 4
收起左侧

[技术专题] 如何应对会多次调用但是只想执行一次?

[复制链接]
结帖率:94% (133/141)
发表于 2020-12-20 18:02:23 | 显示全部楼层 |阅读模式   山东省济南市
在某些时候我们使用别人的模块或者支持库的时候可能会遇到以下情况:当我们需要在某个任务执行完了以后进行一次刷新(超级列表或者其他的),但是模块/支持库每次遇到设定的操作都会触发一次该子程序。
我们每次被调用的时候并不需要每次都刷新,或者是因为模块/支持库调用的太快导致频繁刷新出现错误【譬如出现莫名其妙的项目】
我的应用场景:使用监视目录模块的时候每次有文件变动都会触发一次以上的子程序(下称“函数”)调用,但是如果每次都刷新超级列表则会造成超级列表里出现某些奇怪的项目(我不知道这是不是易语言本身的问题导致的)。然而并不是每个文件变动我都需要枚举一次文件列表,我只需要在所有文件变动结束后再枚举即可。
然后我想到了一个办法,利用SetTimer时钟重复调用会刷新上次时钟的周期的特性来推迟刷新。也就是说每次被调用一定时间(500毫秒)内如果再次调用就会因为调用了SetTimer时钟而导致这个时钟周期被重置。一定时间(500毫秒)后如果没有操作就不会再次调用这个SetTimer时钟,也就会因为时钟周期到了而被执行。
      群众:时钟不是每过一定时间(500毫秒)就会执行一次么?这样岂不是每过一定时间就会刷新一次么?
      我的解决办法就是在刷新的时候使用KillTimer来结束这个时钟。这样就不会重复执行了。
如果您发现输入“SetTimer”和“KillTimer”会提示没有这个子程序一类的错误,请在您的源码内粘贴以下dll代码:
  
DLL命令名返回值类型公开备 注
SetTimer整数型 用指定的超时值创建或替换一个定时器。如果函数成功并且hWnd参数为NULL,则返回值为标识新定时器的整数,应用程序可以将此值传递给KillTimer函数以销毁定时器。如果函数成功并且hWnd参数不为NULL,则返回值为非零整数,应用程序可以将nIDEvent参数的值传递给KillTimer函数以销毁定时器。如果函数无法创建定时器,则返回值为零。要获取扩展的错误信息,请调用GetLastError。
DLL库文件名:
user32.dll
在DLL库中对应命令名:
SetTimer
参数名类 型传址数组备 注
hWnd整数型与定时器关联的窗口句柄。如果将为 NULL 的 hWnd 与现有定时器的 nIDEvent 一起传递,该定时器将被替换的方式与现有的非 NULL 的 hWnd 定时器相同。
nIDEvent整数型非零的定时器ID。如果 hWnd 参数为 NULL,并且 nIDEvent 与现有定时器不匹配,则会忽略该参数并生成新的定时器ID。如果 hWnd 参数非 NULL,并且 hWnd 指定的窗口已具有具有值为 nIDEvent 的定时器,则现有定时器将被新定时器替换。当 SetTimer 替换定时器时,定时器将重置。因此,将在当前超时值过去之后发送一条消息,但先前设置的超时值将被忽略。如果该调用不是要替换现有的定时器,则如果 hWnd 为 NULL,则 nIDEvent 应为 0。
uElapse整数型超时值,以毫秒为单位。如果 uElapse 小于 USER_TIMER_MINIMUM(10),则将超时设置为 USER_TIMER_MINIMUM。如果 uElapse 大于 USER_TIMER_MAXIMUM(2147483647),则将超时设置为 USER_TIMER_MAXIMUM。
lpTimerFunc整数型当超时值过去时,指向要通知的函数指针。有关该函数的更多信息,请参见 TimerProc 。如果 lpTimerFunc 为 NULL,则系统将 WM_TIMER 消息发送到应用程序消息队列的 MSG 结构的 hwnd 成员包含 hWnd 参数的值。
DLL命令名返回值类型公开备 注
KillTimer逻辑型 销毁指定的定时器。
DLL库文件名:
user32.dll
在DLL库中对应命令名:
KillTimer
参数名类 型传址数组备 注
hWnd整数型与指定定时器关联的窗口的句柄。此值必须与传递给创建定时器的SetTimer函数的hWnd值相同。
uIDEvent整数型要销毁的定时器。如果传递给SetTimer的窗口句柄有效,则此参数必须与传递给SetTimer的nIDEvent相同。如果应用程序调用SetTimer的hWnd设为NULL,这个参数必须由SetTimer返回的定时器ID。


      看不懂?我来告诉你怎么用!
SetTimer (窗口句柄, 任意数字,时钟周期,子程序指针)
子程序指针就是在子程序名字前面加“&”
KillTimer (窗口句柄, 任意数字)
注意的是这个窗口句柄和任意数字必须和settimer时候输入的完全一样。




补充内容 (2021-1-3 20:57):
之所以不用全局/模块变量,是因为这个子程序并非在程序运行期间仅执行一次。意思是譬如某模块遇到文件改名会调用两次。

补充内容 (2021-1-3 20:58):
但是在这两次调用期间我只想要运行一次。

补充内容 (2021-1-3 21:03):
然而在这个程序关闭前如果在需要调用还是可以用的

结帖率:94% (133/141)
 楼主| 发表于 2021-1-3 21:01:35 | 显示全部楼层   山东省济南市
aoesir 发表于 2020-12-20 23:13
[e=3].版本 2

.程序集 程序集1

抱歉!这个教程我没说清楚,已经补充。
你这个方案结局就是整个程序运行期间只能刷新一次。

而我写的这个需求是每次文件更名都会调用两次以上,但是我只要执行一次。非程序运行期间只能执行一次。

简单说就是譬如我一次性改10个文件名,那个模块会调用20次,然后我只需要运行一次。
但是下次改名还得运行。

你这用模块变量的结果就是整个运行期间只能运行一次。
回复 支持 反对

使用道具 举报

结帖率:94% (15/16)
发表于 2020-12-20 23:13:22 | 显示全部楼层   四川省巴中市
  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
isFirst整数型  

子程序名返回值类型公开备 注
子程序1  
如果真 (isFirst = 0)
isFirst = 1
' 执行代码巴拉巴拉



回复 支持 反对

使用道具 举报

结帖率:94% (15/16)
发表于 2020-12-20 23:12:46 | 显示全部楼层   四川省巴中市
  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
isFirst整数型  

子程序名返回值类型公开备 注
子程序1  
如果真 (isFirst = 0)
isFirst = 1
' 执行代码巴拉巴拉


点评

言简意赅   北京市北京市  发表于 2021-12-8 22:25
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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