请教高手,代码运行过程中如何加上超时机制
Block(1)FileCopy(\\192.168.1.2\iso\3Dmax.iso,"D:\",1)
........
........
Block(0)
Exit
因为需要复制完文件后面的代码才能生效,但是由于文件体积大,局域网不稳定引起传输很慢等因素,假设卡住很长时间,那么用户键鼠就得不到解锁。所以我想设置一个超时的机制,在FileCopy这个命令开始执行,同时开始计时,超过600秒程序就提示一下然后完全退出。由于程序都是一句接一句执行的,上句不执行完下句就不执行,我不知道该怎么做???请教各位高手,感激不尽!!! sleep..... 等FileCopy执行完了,再执行sleep不是空等吗??? 回复 3# elexy
filecopy没有超时的吧。
要么多进程,要么换个思路。 多进程.....{:face (229):} 用第二个进程等待,到时间就做一个结束标志 有没有具体点的代码,搞不懂多进程怎么写? FileExists或filegetsize试一下! adlibregister()函数和timer()函数,综合运用下。 Dim $i;定义I为秒
Break(1)
AdlibEnable('_ti',1000)
FileCopy('\\192.168.1.2\iso\3Dmax.iso',"D:\",1)
;........
;........
Break(0)
Exit
Func _ti()
$i += 1
If $i = 60 Then
MsgBox(64,'提示','超时.');1分钟提示超时
Exit
EndIf
EndFunc 楼上正解。。 10 11楼测试过吗?
AU3在Filecopy处阻塞了,此时 adlib 和 time 就是浮云了。 创建一个新的窗口,在那个窗口里 filecopy。 10 11楼测试过吗?
AU3在Filecopy处阻塞了,此时 adlib 和 time 就是浮云了。
republican 发表于 2010-11-6 20:28 http://www.autoitx.com/images/common/back.gif
应该不会阻塞
先adlib 注册函数,其运行形式是与其他代码并发运行的,而非某代码所独占!
循环挂起,偶就有试过。。。 回复 14# _ddqs.
在程序有空闲的时候,adlib 和 timer确实能够执行...
但在阻塞语句处,adlib就是个无用功...
adlib及time必须得等到正在执行的该行代码执行完后方能运行,循环不循环的与adlib能否执行无关.
这么说, adlibreg 10s 后执行,
使用以下代码确实没问题.
while 1
$i +=1
sleep(50)
wend
但如果你使用filecopy,复制一个100G的文件,该行代码大概需要1分钟.
那么,在此期间,adlib不起作用。
但当filecopy一完,马上执行5-6次adlib的函数。
要使adlib可以使用,需要使用多线程,但Au3现时无成熟的多线程代码。
所以目前只有两个方法:
1. 新开多进程直接终止。
2. 使用非阻塞性代码。
当然以后者最容易实现。
这样,需要将filecopy函数拆分,使用以下代码实现.
a = fileopen(远程)
b = fileopen(本地)
while 1
d = fileread(a,1024)
filewrite(b,d)
sleep(10)
wend
fileclose(a)
fileclose(b)
只有当程序为非阻塞时,定时器才能执行。
换句话说,在同一线程中,任何一条语句均是阻塞的,只是阻塞时间有长有短。定时器需在程序代码执行的间隔时间中才能被触发。
页:
[1]