lgdobo 发表于 2020-4-3 21:57:32

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

本帖最后由 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 的过程体现呢

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

lgdobo 发表于 2020-4-3 23:40:02

sh1536 发表于 2020-4-3 22:42
#RequireAdmin#include
#include
#include


谢谢指导,大概看明白 AdlibRegister 的意思了
另外我想在备份中插入 备份的过程 需要什么函数
比如    正在复制1.txt   1.txt复制完成   这个应该是要获取我备份时候的事件

sh1536 发表于 2020-4-4 14:14:09

是我把事情想简单了,还是你把事情想复杂了?

在DirMove($a, $b, 1)语句前加一句类似这样的 GUICtrlSetData($Edit1, "正在复制:" & $a),后加一句GUICtrlSetData($Edit1, $a & "复制完成")

lgdobo 发表于 2020-4-4 18:40:18

sh1536 发表于 2020-4-4 14:14
是我把事情想简单了,还是你把事情想复杂了?

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

学习了,是我想的太复杂了 ,因为当时考虑文件多 得将所有文件的子文件做变量 但是文件内容又不一样 思绪乱了。感谢帮助

sh1536 发表于 2020-4-5 01:31:13

lgdobo 发表于 2020-4-4 18:40
学习了,是我想的太复杂了 ,因为当时考虑文件多 得将所有文件的子文件做变量 但是文件内容又不一样 思绪 ...

文件多的话可以把文件路径做成数组,循环跑一下,这样只需要关注数组的内容,不需要再考虑_beifen这个函数了
页: [1]
查看完整版本: 【已解决】双死循环 处理第二个 然后gui的按键不能用