找回密码
 加入
搜索
查看: 2038|回复: 5

[AU3基础] 【已解决】双死循环 处理第二个 然后gui的按键不能用

[复制链接]
发表于 2020-4-3 21:57:32 | 显示全部楼层 |阅读模式
本帖最后由 lgdobo 于 2020-4-4 18:46 编辑

先上代码
#RequireAdmin
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("历史数据保存", 230, 180, -1, -1)
$MenuItem1 = GUICtrlCreateMenu("菜单")
$MenuItem2 = GUICtrlCreateMenuItem("暂停", $MenuItem1)
$MenuItem3 = GUICtrlCreateMenuItem("退出", $MenuItem1)
$Label1 = GUICtrlCreateLabel("进程", 10, 16, 230, 17)
$Edit1 = GUICtrlCreateEdit("", 32, 64, 185, 89)
GUICtrlSetData(-1, "Edit1")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Global $a = "c:\数据上传\data\backup"
Global $c = "c:\数据上传\DBDATA\backup"
Global $b = "d:\数据上传\data\backup"
Global $d = "d:\数据上传\DBDATA\backup"
_main()
Exit

Func _chuangti()
While 1
        $nMsg = GUIGetMsg()
        
        Switch $nMsg
                Case -3
                        GUISetState(@SW_SHOWMINIMIZED)
                Case $MenuItem3
                        Exit

        EndSwitch
WEnd        
EndFunc
Func _main()
        _beifen()
        _chuangti()

EndFunc   ;==>_main

Func _beifen()
        While 1
                DirMove($a, $b, 1)
                ;Sleep(1000)
                DirMove($c, $d, 1)
                Sleep(2000)
                GUICtrlSetData($Label1,"数据正常备份"&" "&_NowCalc())
        WEnd
EndFunc
一些数据记录因为原软件为了防止卡顿设置成了定时清除,但是我这里要求永久保存,本来这个拿P处理其实挺简单的,不过最近学AU3就想做个可视化的小程序,那么问题来了。我这的写相当于成了2个死循环,在循环复制数据时候,GUI 的按键就不可以用了  。我查看了 论坛里的帖子   大概的意思有几种  1种是AU3不支持多线程 所以我这个实现不了   2再就是有的大神说因为 sleep 的原因 导致我在按键的时候 脚本是停止的(尝试过将第二循环放在GUI循环里) 3  还有大神提示的很简单exitloop     我就在第二循环里做了 if  但是 循环一旦开始   GUI 的这个点什么也不灵了 也就是改不了变量  4 可以AdlibRegister 这个函数看了不会用  5 还有个说什么阻断时间的 也是1头雾水     论坛里的各种大神貌似对这个讨论过很多 有点愚笨 看不懂啊  
求指教

还有还有  我想在edit 里面实时显示 复制过程  应该用什么函数  请也告一下我知道修改控件  但是怎么能把DirMove 的过程体现呢
发表于 2020-4-3 22:42:13 | 显示全部楼层
本帖最后由 sh1536 于 2020-4-3 22:49 编辑

#RequireAdmin#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>
#include <GuiMenu.au3>

Global $a = "c:\数据上传\data\backup"
Global $c = "c:\数据上传\DBDATA\backup"
Global $b = "d:\数据上传\data\backup"
Global $d = "d:\数据上传\DBDATA\backup"
Global $qTime = 2000 ;备份时间间隔

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("历史数据保存", 230, 180, -1, -1)
$Menu = GUICtrlCreateMenu("菜单")
$hMenu = GUICtrlGetHandle($Menu)
$MenuItem1 = GUICtrlCreateMenuItem("暂停", $Menu)
$MenuItem2 = GUICtrlCreateMenuItem("退出", $Menu)
$Label1 = GUICtrlCreateLabel("进程", 10, 16, 230, 17)
$Edit1 = GUICtrlCreateEdit("", 32, 64, 185, 89)
GUISetState(@SW_SHOW)
AdlibRegister("_beifen", $qTime)
#EndRegion ### END Koda GUI section ###

_beifen() ;打开软件先备份一次
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        GUISetState(@SW_SHOWMINIMIZED)
                Case $MenuItem1
                        If _GUICtrlMenu_GetItemText($hMenu, $MenuItem1, False) = "暂停" Then
                                AdlibUnRegister("_beifen")
                                GUICtrlSetData($Edit1, "备份暂停")
                                _GUICtrlMenu_SetItemText($hMenu, $MenuItem1, "继续", False)
                        Else
                                _beifen()
                                AdlibRegister("_beifen", $qTime)
                                _GUICtrlMenu_SetItemText($hMenu, $MenuItem1, "暂停", False)
                        EndIf
                Case $MenuItem2
                        Exit
        EndSwitch
WEnd

Func _beifen()
        GUICtrlSetData($Edit1, "备份中...")
        DirMove($a, $b, 1)
        DirMove($c, $d, 1)
        GUICtrlSetData($Label1,"数据正常备份"&" "&_NowCalc())
EndFunc

 楼主| 发表于 2020-4-3 23:40:02 | 显示全部楼层
sh1536 发表于 2020-4-3 22:42
[au3]#RequireAdmin#include
#include
#include

谢谢指导,大概看明白 AdlibRegister 的意思了
另外  我想在备份中插入 备份的过程 需要什么函数
比如    正在复制1.txt     1.txt复制完成   这个应该是要获取  我备份时候的事件
发表于 2020-4-4 14:14:09 | 显示全部楼层
是我把事情想简单了,还是你把事情想复杂了?

在DirMove($a, $b, 1)语句前加一句类似这样的 GUICtrlSetData($Edit1, "正在复制:" & $a),后加一句GUICtrlSetData($Edit1, $a & "复制完成")
 楼主| 发表于 2020-4-4 18:40:18 | 显示全部楼层
sh1536 发表于 2020-4-4 14:14
是我把事情想简单了,还是你把事情想复杂了?

在DirMove($a, $b, 1)语句前加一句类似这样的 GUICtrlSetD ...

学习了,是我想的太复杂了 ,因为当时考虑文件多 得将所有文件的子文件做变量 但是文件内容又不一样 思绪乱了。  感谢帮助
发表于 2020-4-5 01:31:13 | 显示全部楼层
lgdobo 发表于 2020-4-4 18:40
学习了,是我想的太复杂了 ,因为当时考虑文件多 得将所有文件的子文件做变量 但是文件内容又不一样 思绪 ...

文件多的话可以把文件路径做成数组,循环跑一下,这样只需要关注数组的内容,不需要再考虑_beifen这个函数了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 13:26 , Processed in 0.076548 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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