nmgwddj 发表于 2012-10-14 20:41:26

如何暂停一个正在执行的递归?(已解决)

本帖最后由 nmgwddj 于 2012-10-16 22:15 编辑

最近在做一款工具,想扫描下磁盘下所有的目录。使用到了这个帖子中的递归。

当递归函数在运行过程中,我想通过一个按钮暂停递归函数,需要的时候再根据上次执行到的位置“继续”进行递归扫描。

在论坛搜索了一下,一般都是在一个循环中暂停,貌似没有可以暂停函数执行的办法,请问各位大神可有方案?

zch11230 发表于 2012-10-14 21:39:34

首先我还不太理解递归是什么,看代码好像就是自己调用自己,所以不知道这样算不算暂停递归
Global $i = 1, $pause = 1
HotKeySet("!a", "_hotkey")

_test()

MsgBox(0, "", $i)

Func _test()
        ConsoleWrite($i & @LF)
        $i += 1
        Sleep(100)
        If $pause And $i < 10000 Then _test()
EndFunc   ;==>_test

Func _hotkey()
        Dim $pause = 0
EndFunc   ;==>_hotkey

zch11230 发表于 2012-10-14 21:54:10

不对 上面的应该算是结束。。。那这样算不算暂停Global $i = 1, $pause = 1
HotKeySet("!a", "_hotkey")

_test()

MsgBox(0, "", $i)

Func _test()
        If $pause Then
                ConsoleWrite($i & @LF)
                $i += 1
        EndIf
        Sleep(100)
        If $i < 10000 Then _test()
EndFunc   ;==>_test

Func _hotkey()
        $pause = BitAND(BitOR(1, 0), BitNOT($pause))
EndFunc   ;==>_hotkey

nmgwddj 发表于 2012-10-15 00:37:23

回复 3# zch11230


    非常感谢楼上代码,不知道能否通过按钮方式来控制?

881966 发表于 2012-10-15 16:33:42

参考一下努力学习中{:face (411):}

user3000 发表于 2012-10-15 19:28:25

按我理解, 调用一个函数等于开启一个线程.当没有多线程功能时,如何能实现这类暂停?
即使你像2,3楼一样记录下变量的值,以该值再次调用函数,其实不能算作真正暂停吧?况且,如果涉及大数据量,你要记录几个变量呢?

nmgwddj 发表于 2012-10-15 23:52:40

回复 6# user3000


    不错,甚是纠结,先把其他功能实现再说,这个问题我一定要在au3上实现。

netegg 发表于 2012-10-16 00:15:20

本帖最后由 netegg 于 2012-10-16 00:19 编辑

adlibregister运行递归循环
adlibunregister退出递归循环,取此时返回值
重新按键时再次运行递归循环,代入返回值
只是思路,代码懒得写,似乎返回值会不准,曾经写过个类似要求的,没什么印象了

nmgwddj 发表于 2012-10-16 00:35:02

回复 8# netegg


    一旦递归执行,其他所有界面上的按钮都无法点击了,只能等待递归执行完成,除非是快捷键。

netegg 发表于 2012-10-16 00:38:43

回复 9# nmgwddj
不是吧,我试过,倒计时用的就是按钮,只不过有延迟无法及时响应而已

nmgwddj 发表于 2012-10-16 03:32:24

回复 10# netegg

试过,的确不行的。是不是类似这个意思?


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 336, 214, 368, 182)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Button1 = GUICtrlCreateButton("Button1", 136, 56, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
$Button2 = GUICtrlCreateButton("Button2", 136, 88, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
WEnd

Func Button1Click()
        Test()
EndFunc
Func Button2Click()
        MsgBox(0, '', '这个按钮有效吗?')
EndFunc
Func Form1Close()
        Exit
EndFunc


Func Test()
        Sleep(100)
        Test()
EndFunc

netegg 发表于 2012-10-16 09:50:38

回复 11# nmgwddj

差远了,用adlibregister做出个同步函数,退出函数用adlibunregister

nmgwddj 发表于 2012-10-16 21:39:13

回复 12# netegg


    还是不太理解,望netegg明示{:face (382):}

netegg 发表于 2012-10-16 21:54:57

点击按钮,执行立即同步,再点击注销同步

netegg 发表于 2012-10-16 22:07:42

本帖最后由 netegg 于 2012-10-16 22:12 编辑

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
Global $i=1
$Form1 = GUICreate("Form1", 336, 214, 368, 182)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Button1 = GUICtrlCreateButton("Button1", 136, 56, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
$Button2 = GUICtrlCreateButton("Button2", 136, 88, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
      Sleep(100)
WEnd

Func Button1Click()
       AdlibRegister('Test')
EndFunc
Func Button2Click()
AdlibUnRegister()
MsgBox(0,0,$i)
EndFunc
Func Form1Close()
      Exit
EndFunc


Func Test()
        While 1
                $i+=1
      Sleep(100)
        WEnd
EndFunc
页: [1] 2
查看完整版本: 如何暂停一个正在执行的递归?(已解决)