找回密码
 加入
搜索
查看: 11738|回复: 26

[AU3基础] 程序就差最后1步了。求大神支招关于_Timer_SetTimer 函数问题

[复制链接]
发表于 2012-6-16 00:30:53 | 显示全部楼层 |阅读模式
本帖最后由 jienis 于 2012-6-16 00:32 编辑

我的程序利用了_Timer_SetTimer 函数,

每60秒执行1次我定义的A函数,我在窗体放了1个倒计时,60到计到1之后又恢复60到1

但问题来了,我的A函数包括一些IE的操作,大家都知道IE打开网页需要时间,这个时间是不确定的,有时网速慢点或其他原因,开起来就慢点。。

就是因为这样,导致我的的60秒倒计时拖长了。。。经过我测试,60到计到1,执行了A,但此时1不是我想象的中的马上变为60再到计,而是在1卡住了,则到A函数执行网页操作完毕了,再从60开始。。

这样导致了延迟,或许这样的延迟不算什么,但在一个每隔1段时间开奖的网页中,我的自动投注程序就因为延迟而导致无法投注了。。

有什么办法,就是60倒计到1,再60倒1,中间A函数不管是否执行完,都不理了,因为我60秒足够它慢慢投注了,就算天塌下来也不理了,反正就是强制倒数强制执行。。

程序就差这个问题了,麻烦牛人给个思路,感激不尽。。
发表于 2012-6-16 00:43:09 | 显示全部楼层
计时应该和A函数分开执行。
无代码,没法分析
 楼主| 发表于 2012-6-16 00:57:07 | 显示全部楼层
回复 2# afan


    已经分开了。。。我把要执行的一系列操作都在A函数,而_Timer_SetTimer 我只是用来倒计时变量Q从60一直减到1,倒计时里,用IF判断是变量Q否为1,是的话,就执行A,然后再给Q赋值60。。。。。
发表于 2012-6-16 01:02:13 | 显示全部楼层
回复  afan


    用IF判断是变量Q否为1,是的话,就执行A,然后再给Q赋值60 ...
jienis 发表于 2012-6-16 00:57


就是这里的问题,这不算分开…
 楼主| 发表于 2012-6-16 01:09:37 | 显示全部楼层
回复 4# afan


    那给个思路,说说逻辑结构就可以了。
发表于 2012-6-16 01:13:01 | 显示全部楼层
If $Q = 1 Then AdlibRegister('A', 10)

Func A()
AdlibUnRegister()
...
 楼主| 发表于 2012-6-16 01:15:26 | 显示全部楼层
回复 6# afan


    我百度之后也发现有这样的AdlibRegister函数,你代码里的10是啥意思呢
发表于 2012-6-16 02:18:34 | 显示全部楼层
回复 7# jienis

au3自带的一个函数,类似计时器,10是每10秒执行一次A函数,具体细节请看帮助文档

评分

参与人数 1金钱 +1 收起 理由
user3000 + 1 应该是毫秒

查看全部评分

发表于 2012-6-16 03:55:34 | 显示全部楼层
回复 8# komaau3

和计时器无关,可能说多进程同步更合适点
发表于 2012-6-16 05:33:47 | 显示全部楼层
同意蛋老大的话!
我看楼主为定时器专门写个EXE吧, 定时调用带有A函数的另一EXE.
发表于 2012-6-16 07:56:14 | 显示全部楼层
AU3的类AdlibRegister函数,也是受程序运行的影响的,除非是多线程
实在不行就多进程呗
 楼主| 发表于 2012-6-16 08:27:55 | 显示全部楼层
回复 11# auto


    解决咯,可以了。。。_Timer_SetTimer 跟AdlibRegister结合。。。倒计时用AdlibRegister,加一个开关0跟1,。。。再用_Timer_SetTimer 每隔1秒判断开关来执行A函数。。。就可以了。。。。自己捣鼓。。。可以用。。
发表于 2012-6-16 10:15:03 | 显示全部楼层
LZ 如果有简单源码例子应该早就解决了。
要做到LZ的要求实现的方法不少,这里写了个简单例子,给需要的朋友参考
#include <Timers.au3>

Local $hGUI = GUICreate('_Timer_SetTimer 倒计时+任务例子', 350, 100)
Local $Label1 = GUICtrlCreateLabel('20秒倒计时中…', 8, 8, 340, 12)
Local $Label2 = GUICtrlCreateLabel('20', 120, 40, 100, 30, 0x01)
GUICtrlSetFont(-1, 20, 800, 0, '微软雅黑')
GUISetState()
Global $QS = 20, $Q = $QS, $iLast = 1
$iTimer = _Timer_SetTimer($hGUI, 1000, '_DJS')

While GUIGetMsg() + 3 <> 0
WEnd
_Timer_KillTimer($hGUI, $iTimer)
GUIDelete()

Func _DJS($1, $2, $3, $4)
        #forceref $1, $2, $3, $4
        $Q -= 1
        If $Q = 0 Then
                $Q = $QS
                If $iLast Then AdlibRegister('_A', 10)
        EndIf
        GUICtrlSetData($Label2, $Q)
EndFunc   ;==>_DJS
Func _A()
        AdlibUnRegister()
        $iLast = 0
        GUICtrlSetData($Label1, '正在投票啥的… 如有超时则增加新一轮倒计时')
        Sleep(Random(5000, 30000, 1)) ;模拟5S - 30S(超出单次倒计时范围)延时
        $iLast = 1
        GUICtrlSetData($Label1, '投票完毕,等待下一个倒计时完成…')
EndFunc   ;==>_A

评分

参与人数 1金钱 +10 贡献 +11 收起 理由
xyhqqaa + 10 + 11 学习了、、、、A哥

查看全部评分

发表于 2012-6-16 13:39:39 | 显示全部楼层
回复 12# jienis

只是临时性解决。当主程序有模块或函数运行起adlibereagister 注册的时间就会不准。。。
发表于 2012-6-16 15:01:15 | 显示全部楼层
Ie类操作非要在1秒内完成?没完成也要重新执行意义不是很大。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 02:19 , Processed in 0.097126 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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