找回密码
 加入
搜索
查看: 15330|回复: 19

[效率算法] 如何暂停一个正在执行的递归?(已解决)

 火.. [复制链接]
发表于 2012-10-14 20:41:26 | 显示全部楼层 |阅读模式
本帖最后由 nmgwddj 于 2012-10-16 22:15 编辑

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

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

在论坛搜索了一下,一般都是在一个循环中暂停,貌似没有可以暂停函数执行的办法,请问各位大神可有方案?
发表于 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
发表于 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

评分

参与人数 2金钱 +20 收起 理由
nmgwddj + 10 非常感谢参与
502762378 + 10 学习

查看全部评分

 楼主| 发表于 2012-10-15 00:37:23 | 显示全部楼层
回复 3# zch11230


    非常感谢楼上代码,不知道能否通过按钮方式来控制?
发表于 2012-10-15 16:33:42 | 显示全部楼层
参考一下  努力学习中
发表于 2012-10-15 19:28:25 | 显示全部楼层
按我理解, 调用一个函数等于开启一个线程.当没有多线程功能时,如何能实现这类暂停?
即使你像2,3楼一样记录下变量的值,以该值再次调用函数,其实不能算作真正暂停吧?况且,如果涉及大数据量,你要记录几个变量呢?
 楼主| 发表于 2012-10-15 23:52:40 | 显示全部楼层
回复 6# user3000


    不错,甚是纠结,先把其他功能实现再说,这个问题我一定要在au3上实现。
发表于 2012-10-16 00:15:20 | 显示全部楼层
本帖最后由 netegg 于 2012-10-16 00:19 编辑

adlibregister运行递归循环
adlibunregister退出递归循环,取此时返回值
重新按键时再次运行递归循环,代入返回值
只是思路,代码懒得写,似乎返回值会不准,曾经写过个类似要求的,没什么印象了
 楼主| 发表于 2012-10-16 00:35:02 | 显示全部楼层
回复 8# netegg


    一旦递归执行,其他所有界面上的按钮都无法点击了,只能等待递归执行完成,除非是快捷键。
发表于 2012-10-16 00:38:43 | 显示全部楼层
回复 9# 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

发表于 2012-10-16 09:50:38 | 显示全部楼层
回复 11# nmgwddj

差远了,用adlibregister做出个同步函数,退出函数用adlibunregister
 楼主| 发表于 2012-10-16 21:39:13 | 显示全部楼层
回复 12# netegg


    还是不太理解,望netegg明示
发表于 2012-10-16 21:54:57 | 显示全部楼层
点击按钮,执行立即同步,再点击注销同步
发表于 2012-10-16 22:07:42 | 显示全部楼层
本帖最后由 netegg 于 2012-10-16 22:12 编辑

[au3]#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
[/au3]

评分

参与人数 1金钱 +20 收起 理由
nmgwddj + 20 神奇神奇,我一直以为AdlibRegister不指定时 ...

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-13 19:20 , Processed in 0.083541 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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