找回密码
 加入
搜索
查看: 10614|回复: 17

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

 火.. [复制链接]
发表于 2011-8-4 23:23:47 | 显示全部楼层 |阅读模式
本帖最后由 sdc7 于 2011-8-5 22:35 编辑

很多系统函数都有等待的超时时间,超过以后就退去或执行别的,
那没自定义的函数能实现这个功能吗? 这个东西觉得很有意思,如果很好的实现,做很多事,将有更多的排错处理方法了!
比方说做一个无限循环的函数

func a ($time=5000)
  for i=1 to 999999999
   sleep(1000)
  next
endfunc


大家都是TIMEER但是单线程就有问题聊,如果,函数中某个操作卡主,慢吊很吊花, 那换是得得到执行完毕才能执行显示时间!
我的意思是 比方说函数A执行下载一个图片,  如果A执行超过3秒就重新下载! 给自定义函数加个超时中断!



其实我的核心意思就是给自定义函数加个时间限制 不能超过多长时间 否则就退出!  只是有些函数比方说下载,会一直卡在那里直到读完数据否则不往下执行,所以才要加时间限制!
发表于 2011-8-4 23:41:12 | 显示全部楼层
什么意思,没看懂啊
发表于 2011-8-5 00:18:42 | 显示全部楼层
你是说这样吗?
MsgBox(64,"提示","超时3秒只执行到"&_wait())

Func _wait()
        Local $begin = TimerInit()
        For $i = 1 To 999999
                If TimerDiff($begin) > 3000 Then Return $i
                ;执行的代码
        Next
EndFunc   ;==>_wait

评分

参与人数 1金钱 +20 收起 理由
powerofos + 20

查看全部评分

发表于 2011-8-5 00:26:32 | 显示全部楼层
你是说这样吗?
风行者 发表于 2011-8-5 00:18



他应该是要这个效果了~~
发表于 2011-8-5 00:29:24 | 显示全部楼层
他应该是要这个效果了~~我就没想过这方面...如果能“提取”msgbox,traytip的超时等待实现方法就更好了,应该不难吧?
等待高手的方法。
发表于 2011-8-5 01:38:03 | 显示全部楼层
“如果能“提取”msgbox,traytip的超时等待实现方法就更好了,应该不难吧?”
意思设置超时几秒就退出函数?
把3楼代码中的修改一下不就好了吗?
func _wait($delay)
....
If TimerDiff($begin) > $delay Then Return $i

这东东很少用上吧?
发表于 2011-8-5 01:40:46 | 显示全部楼层
“如果能“提取”msgbox,traytip的超时等待实现方法就更好了,应该不难吧?”
意思设置超时几秒就退出函数 ...
user3000 发表于 2011-8-5 01:38


你没理解5楼要表达的意思
发表于 2011-8-5 06:47:22 | 显示全部楼层
回复 5# powerofos

获取messagebox api的参数指针,然后获得数据,不过这个似乎也不太好整
发表于 2011-8-5 10:27:17 | 显示全部楼层
这样也是可以的
#Include <Timers.au3>
Global $iTimer,$title,$text

$Init = TimerInit()
_MsgBox(0,"提示","超时测试",3)
MsgBox(0,"结束时间",TimerDiff($Init))

Func _MsgBox($id,$title,$text,$time)
        $iTimer = _Timer_SetTimer(0,$time*1000,"_Timer")
        Return MsgBox($id,$title,$text)
EndFunc

Func _Timer($hWnd, $Msg, $iIDTimer, $dwTime)
        WinClose($title,$text)
        _Timer_KillTimer(0,$iTimer)
EndFunc

评分

参与人数 1金钱 +20 收起 理由
powerofos + 20

查看全部评分

发表于 2011-8-5 12:51:41 | 显示全部楼层
这样也是可以的
风行者 发表于 2011-8-5 10:27



改了下,直观些...
#Include <Timers.au3>
Global $iTimer,$Init,$While = 1
 
$Init = TimerInit()

_TrayTip("我只是个ToolTip~~~8秒后退出",8)

TrayTip("我才是TrayTip","我才是TrayTip! 8秒后退出",8)

        
While $While
        Sleep(50)
WEnd 


Func _TrayTip($text,$time)
    $iTimer = _Timer_SetTimer(0,$time*1000,"_Timer")
    Return ToolTip($text,@DesktopWidth-230,@DesktopHeight-140)
EndFunc 
 
Func _Timer($hWnd, $Msg, $iIDTimer, $dwTime)        
    _Timer_KillTimer(0,$iTimer)
        ToolTip("")
        $While = 0
EndFunc
发表于 2011-8-5 18:58:03 | 显示全部楼层
呵呵,回复好有意思。

楼主有两种思路。
1. 把单条语句的执行时间缩到十毫秒级,由TImer来判断是否退出某个函数。

2.  使用Windows消息来创建线程,在线程内做你想要的下载,而不影响主线程的语句执行。创建方法既可以是传统的windows消息,也可以通过Callback来创建自定义消息。
发表于 2011-8-5 19:13:39 | 显示全部楼层
都是高级高手呀、一个一个直接上代码了
发表于 2011-8-5 19:58:19 | 显示全部楼层
各位大大,小弟想弱弱的问一下,上面代码中

#Include <Timers.au3>
_Timer_SetTimer($hWnd [, $iElapse = 250 [, $sTimerFunc = "" [, $iTimerID = -1]]])

$hWnd 为什么是0呢,有什么含义,还请指点一两,不胜感激!
发表于 2011-8-5 20:42:34 | 显示全部楼层
很多系统函数都有等待的超时时间,超过以后就退去或执行别的,
那没自定义的函数能实现这个功能吗? 这个东 ...
sdc7 发表于 2011-8-4 23:23



    其实说到本质的就是au3不支持多线程嘛
你想让自定义函数在那里等着,而脚本接着执行下面的。

只有勉强用多进程试下了,不过,最近用Coproc函数来创建多进程,如:_Coproc("MyFun", "Para")
其中MyFun函数在单独的一个au3文件当中,结果老是提示“变量没有申明”,而其实是在这个au3文件头中用Global申明的全局变量了。另外多进程也远比多线程当资源了,典型的比粒较就是用Fx和Chrome,当两者打开同样的链接100个(每个链接一个Tab),结果Chrome几乎卡到动不了,CPU已经100%了,而Fx开100个跟开10个Tab区别不大。原因就是Chrome每个Tab就是一个子进程,而Fx用多线程来开Tab

评分

参与人数 1金钱 +10 收起 理由
sdc7 + 10 没钱 先收着吧!

查看全部评分

发表于 2011-8-5 22:13:38 | 显示全部楼层
呵呵,回复好有意思。

楼主有两种思路。
1. 把单条语句的执行时间缩到十毫秒级,由TImer来判断是否退出 ...
republican 发表于 2011-8-5 18:58



Er......回复怎么个有意思法?

请教下,你说的方法二,如果我注册:GUIRegisterMsg($WM_TIMER, "DownloadFunc")
用系统消息来实现楼主说的下载任务,超时退出问题,可以解决吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-19 11:07 , Processed in 0.156619 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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