找回密码
 加入
搜索
查看: 3548|回复: 10

[系统综合] 请教高手,代码运行过程中如何加上超时机制

 火.. [复制链接]
发表于 2010-11-2 17:09:40 | 显示全部楼层 |阅读模式
Block(1)
FileCopy(\\192.168.1.2\iso\3Dmax.iso,"D:\",1)
........
........
Block(0)
Exit
因为需要复制完文件后面的代码才能生效,但是由于文件体积大,局域网不稳定引起传输很慢等因素,假设卡住很长时间,那么用户键鼠就得不到解锁。所以我想设置一个超时的机制,在FileCopy这个命令开始执行,同时开始计时,超过600秒程序就提示一下然后完全退出。由于程序都是一句接一句执行的,上句不执行完下句就不执行,我不知道该怎么做???请教各位高手,感激不尽!!!
发表于 2010-11-2 18:37:38 | 显示全部楼层
sleep.....
 楼主| 发表于 2010-11-3 08:02:58 | 显示全部楼层
等FileCopy执行完了,再执行sleep不是空等吗???
发表于 2010-11-3 08:21:34 | 显示全部楼层
回复 3# elexy

filecopy没有超时的吧。

要么多进程,要么换个思路。
 楼主| 发表于 2010-11-3 09:22:37 | 显示全部楼层
多进程.....
发表于 2010-11-3 11:01:10 | 显示全部楼层
用第二个进程等待,到时间就做一个结束标志
 楼主| 发表于 2010-11-3 15:36:25 | 显示全部楼层
有没有具体点的代码,搞不懂多进程怎么写?
发表于 2010-11-3 15:54:40 | 显示全部楼层
FileExists或filegetsize试一下!
发表于 2010-11-4 15:47:43 | 显示全部楼层
adlibregister()函数和timer()函数,综合运用下。
发表于 2010-11-5 22:21:17 | 显示全部楼层
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
发表于 2010-11-6 11:56:25 | 显示全部楼层
楼上正解。。
发表于 2010-11-6 20:28:51 | 显示全部楼层
10 11楼测试过吗?

AU3在Filecopy处阻塞了,此时 adlib 和 time 就是浮云了。
发表于 2010-11-6 21:21:44 | 显示全部楼层
创建一个新的窗口,在那个窗口里 filecopy。
发表于 2010-11-8 18:17:47 | 显示全部楼层
10 11楼测试过吗?

AU3在Filecopy处阻塞了,此时 adlib 和 time 就是浮云了。
republican 发表于 2010-11-6 20:28



应该不会阻塞
先adlib 注册函数,其运行形式是与其他代码并发运行的,而非某代码所独占!
循环挂起,偶就有试过。。。
发表于 2010-11-8 21:59:20 | 显示全部楼层
回复 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)

只有当程序为非阻塞时,定时器才能执行。

换句话说,在同一线程中,任何一条语句均是阻塞的,只是阻塞时间有长有短。定时器需在程序代码执行的间隔时间中才能被触发。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 11:41 , Processed in 0.087611 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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