ac5474012 发表于 2010-8-4 10:58:43

利用 AdlibRegister 后如何从程序开头继续开始?

我做了一个脚本,用来导出数据,简单的工作原理是;我有一个ID列表,每次选一个ID,在选一个日期,在按一个按钮就可以导出一些数据.少数ID会导致导出数据时报错,错误千奇百怪.

所以我需要利用 AdlibRegister 函数检测如果一个ID的数据导出的时间长达1小时,就要将这个ID列入黑名单并从新开始.

问题:
1.而现在我的问题就是在利用 AdlibRegister 调用一个自定义函数确定过了一小时后.如何从程序的某个特定行从新开始,或是在程序开头开始就像从新打开它一样?


我用 _NowCalc 计算时间的方法确定是否过了一小时.

这是这个帖子的衍生问题
我做了一个循环按键模拟安装程序的脚本,如何检测它长时间没有进行动作?

好吧,我承认写的有点模糊,在这里 ...
ac5474012 发表于 2010-8-2 15:40 http://www.autoitx.com/images/common/back.gif

wanhua8u8 发表于 2010-8-4 14:04:11

AdlibRegister自带超时监测

3mile 发表于 2010-8-4 14:56:21

本帖最后由 3mile 于 2010-8-4 14:58 编辑

先将你现有的程序做成一个主函数。
注册 A 函数进行数据检测,超时时长定为1小时。==》数据无变化则 A函数 返回错误信息,且注册 B函数(此函数调用你的主函数后立即反注册或在主函数开始即反注册)==》反注册 A函数。

不知道我的描述是否准确(的确有点绕口),希望能帮到你。

ac5474012 发表于 2010-8-4 17:12:23

AdlibRegister自带超时监测
wanhua8u8 发表于 2010-8-4 14:04 http://www.autoitx.com/images/common/back.gif

这和超时有什么关系?

ac5474012 发表于 2010-8-4 17:19:46

先将你现有的程序做成一个主函数。
注册 A 函数进行数据检测,超时时长定为1小时。==》数据无变化则 A函 ...
3mile 发表于 2010-8-4 14:56 http://www.autoitx.com/images/common/back.gif

你的意思是我把主要脚步变成一个自定义函数,直接调用是把?

感谢你的答案,但是把主脚本变成一个函数可能会出现很多错误。我现在的脚本已经很大了,我不想做大改动了。请各位在帮我想想还有别的办法吗?

ac5474012 发表于 2010-8-5 16:08:14

...请大家帮我想想办法吧

thesnow 发表于 2010-8-5 17:58:07

任何暂停将导致整个脚本暂停.
主函数暂停,adlib也会暂停.
adlib暂停,主函数也会死.

auto 发表于 2010-8-5 19:14:53

AU3就是这样的,如果有那个地方卡了,AdlibRegister函数也不起作用,不是真正的定时器

3mile 发表于 2010-8-5 23:36:14

如果不用AdlibRegister函数而改用_timer_settimer函数定义计时器呢?
就向这样,msgbox的中断级别应该很高了吧,计时器一样有效:#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <Timers.au3>

;Global $Sec = 0
;Global $Min = 1
Local $sec = 0, $min = 1
$mainwindow = GUICreate("倒计时 ", 162, 82, 400, 300, BitOR($WS_POPUP, $WS_CLIPSIBLINGS))
$Label = GUICtrlCreateLabel("标签", 0, 0, 162, 82, $SS_BLACKFRAME, $GUI_WS_EX_PARENTDRAG) ;通过右键菜单退出-拖拽
;FileInstall("tu.jpg", @TempDir & "\") ;编译图片
;$Pic1 = GUICtrlCreatePic(@TempDir & "\tu.jpg", 0, 0, 162, 82)
$FontMin = GUICtrlCreateLabel(StringFormat('%02s', $min), 22, 2, 48, 39)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xc24343)
GUICtrlSetFont(-1, 34, 400, 0, "@黑体")
$FontD = GUICtrlCreateLabel(":", 68, 2, 48, 39)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xc24343)
GUICtrlSetFont(-1, 34, 400, 0, "@黑体")
$FontSec = GUICtrlCreateLabel(StringFormat('%02s', $sec) & ":", 90, 2, 48, 39)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xc24343)
GUICtrlSetFont(-1, 34, 400, 0, "@黑体")
$contextmenu = GUICtrlCreateContextMenu(3)
$Start = GUICtrlCreateMenuItem("开始", $contextmenu)
$Abort = GUICtrlCreateMenuItem("关于", $contextmenu)
GUICtrlCreateMenuItem("", $contextmenu)
$infoitem = GUICtrlCreateMenuItem("退出", $contextmenu)
GUISetState(@SW_SHOW)

While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case -3, $infoitem ; 退出
                        infoitem()
                Case $Start
                        _Timer_SetTimer($mainwindow, 1000, "_UpdateStatusBarClock")                                               
                        $sec = 0
                        $min = 1
                                                MsgBox(0,0,"ok")
                        GUICtrlSetState($start,$GUI_DISABLE)                        
      EndSwitch
WEnd

Func _UpdateStatusBarClock($hWnd, $Msg, $iIDTimer, $dwTime)
      If $sec = 0 And $min = 0 Then
                _Timer_KillAllTimers($mainwindow)
                GUICtrlSetState($start,$GUI_ENABLE)
      Else
                If $sec <= 0 Then
                        $sec = 60 + $sec
                        $min -= 1
                EndIf
                $sec -= 1
                GUICtrlSetData($FontMin, StringFormat('%02s', $min))
                GUICtrlSetData($FontSec, StringFormat('%02s', $sec))
      EndIf
EndFunc   ;==>_UpdateStatusBarClock

Func infoitem()
      FileDelete(@TempDir & "\tu.jpg") ;删除图片
      Exit
EndFunc   ;==>infoitem

ac5474012 发表于 2010-8-6 09:42:09

回复 8# auto

其实我主要是因为WinWait而卡住的

ac5474012 发表于 2010-8-6 09:42:43

回复 9# 3mile

谢谢,我试试去.

auto 发表于 2010-8-6 22:26:44

回复auto

其实我主要是因为WinWait而卡住的
ac5474012 发表于 2010-8-6 09:42 http://www.autoitx.com/images/common/back.gif

adlibregister调用的函数里面放一个检测窗口动作,没检测不就跳出函数,不动作,检测到相关窗口再执行相关的动用

ghl781258 发表于 2010-8-7 11:53:10

_timer_settimer函数 很有启发意义啊

lxd510213 发表于 2010-8-8 15:10:12

把程序做成函数,增加检测工能

netegg 发表于 2010-8-9 04:50:29

如果会玩的话,用_winapi_CreateSemaphore试试
页: [1] 2
查看完整版本: 利用 AdlibRegister 后如何从程序开头继续开始?