jienis 发表于 2012-6-16 00:30:53

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

本帖最后由 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秒足够它慢慢投注了,就算天塌下来也不理了,反正就是强制倒数强制执行。。

程序就差这个问题了,麻烦牛人给个思路,感激不尽。。

afan 发表于 2012-6-16 00:43:09

计时应该和A函数分开执行。
无代码,没法分析

jienis 发表于 2012-6-16 00:57:07

回复 2# afan


    已经分开了。。。我把要执行的一系列操作都在A函数,而_Timer_SetTimer 我只是用来倒计时变量Q从60一直减到1,倒计时里,用IF判断是变量Q否为1,是的话,就执行A,然后再给Q赋值60。。。。。

afan 发表于 2012-6-16 01:02:13

回复afan


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

就是这里的问题,这不算分开…

jienis 发表于 2012-6-16 01:09:37

回复 4# afan


    那给个思路,说说逻辑结构就可以了。

afan 发表于 2012-6-16 01:13:01

If $Q = 1 Then AdlibRegister('A', 10)

Func A()
AdlibUnRegister()
...

jienis 发表于 2012-6-16 01:15:26

回复 6# afan


    我百度之后也发现有这样的AdlibRegister函数,你代码里的10是啥意思呢

komaau3 发表于 2012-6-16 02:18:34

回复 7# jienis

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

netegg 发表于 2012-6-16 03:55:34

回复 8# komaau3

和计时器无关,可能说多进程同步更合适点

user3000 发表于 2012-6-16 05:33:47

同意蛋老大的话!
我看楼主为定时器专门写个EXE吧, 定时调用带有A函数的另一EXE.

auto 发表于 2012-6-16 07:56:14

AU3的类AdlibRegister函数,也是受程序运行的影响的,除非是多线程
实在不行就多进程呗

jienis 发表于 2012-6-16 08:27:55

回复 11# auto


    解决咯,可以了。。。_Timer_SetTimer 跟AdlibRegister结合。。。倒计时用AdlibRegister,加一个开关0跟1,。。。再用_Timer_SetTimer 每隔1秒判断开关来执行A函数。。。就可以了。。。。自己捣鼓。。。可以用。。

afan 发表于 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

auto 发表于 2012-6-16 13:39:39

回复 12# jienis

只是临时性解决。当主程序有模块或函数运行起adlibereagister 注册的时间就会不准。。。

seniors 发表于 2012-6-16 15:01:15

Ie类操作非要在1秒内完成?没完成也要重新执行意义不是很大。
页: [1] 2
查看完整版本: 程序就差最后1步了。求大神支招关于_Timer_SetTimer 函数问题