找回密码
 加入
搜索
楼主: sdc7

[效率算法] 自定义函数,能给函数指定个超时时间吗?[已解决]

 火.. [复制链接]
 楼主| 发表于 2011-8-5 22:32:15 | 显示全部楼层
其实说到本质的就是au3不支持多线程嘛
你想让自定义函数在那里等着,而脚本接着执行下面的。

...
happytc 发表于 2011-8-5 20:42



    这个牛逼,再搜搜多进程的! 只会蹩脚的多线程优化一个程序 就提速很多!原来还又多进程解决办法 这个牛逼!
发表于 2011-8-5 23:46:21 | 显示全部楼层
绝对能实现的,思路如下:

一、准备工作。
1、事先调用CreateEvent 创建一个事件句柄 hEvent。
2、修改原有函数 OldFunction 的入口,使其跳转到另一个新的地址 NewFunction中。

二、假设 OldFunction 被某个线程SomeThread 调用,执行流程将会跳转到 NewFunction函数中:
3、调用ResetEvent 复位 hEvent。
4、将hEvent、SomeThread(当前线程)作为参数,创建一个新的线程AsynThread。
5、恢复 OldFunction 入口并调用。
6、OldFunction 执行完成并返回。
7、调用 SetEvent 置位 hEvent。
8、为下一次调用 再次修改 OldFunction 入口。
9、返回。

三、AsynThread要做的事情。
10、调用 WaitForSingleObject 等待 hEvent 置位。
11、检查返回值,如果 hEvent为置位状态,说明在指定时间内 NewFunction 完成对 OldFunction 的调用,跳到第13步。
12、hEvent仍是复位状态,说明等待超时,调用 NtSetThreadContext 设置 SomeThread 的流程,使其从第7步开始向下执行,这相当于 OldFunction执行到一半时被强制返回了。
13、AsynThread线程退出。

第3 ~ 9步都是在 NewFunction 中完成的。10 ~ 13 在新线程AsynThread中完成。

还有许多其他情况没考虑:
比如 OldFunction在执行过程中发生了异常,NewFunction 必须要能处理这个异常。
如果 OldFunction调用了Sleep、WaitForSingleObject这类的函数进入了睡眠状态,AsynThread还必须要调用NtAlertThread来警醒 SomeThread线程。
发表于 2016-2-17 13:53:17 | 显示全部楼层
回复 17# pusofalse


    楼上牛B啊,就是用au3的小白比较多,这么复杂很难实现啊。
要有简单的方法就好了。这个功能想想挺重要的。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 15:15 , Processed in 0.070616 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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