acetaohai123 发表于 2011-12-3 22:09:59

求助关于死循环

我知道用Opt("GUIOnEventMode",1)事件模型来避免死循环不响应按钮的问题。
现在的问题是,我想要点击一个开始按钮之后就在一个GUI窗口计时,计时函数本身就是一个死循环

Func Count_Time($begin,$Index)
        While 1
           Sleep(1000)
                $dif = TimerDiff($begin)
                _GUICtrlListView_SetItemText($listview, $Index, $dif, 6)
    WEnd
EndFunc

怎么样可以让这个函数进行着,并且可以响应我的其他按钮呢?比如关闭也不行了。

user3000 发表于 2011-12-3 23:19:42

本帖最后由 user3000 于 2011-12-3 23:20 编辑

我会用的是:
假设 $But 是 'Start'
Globe $But_State = True
Globe $begin = ...
Fuc ClickButton()
If $But_State Then
        $But_State = False
        GuictrlSetState($But, 'Stop')
        AdlibRegister(1000, 'Cout_Time')
Else
        $But_State = True
        GuictrlSetState($But, 'Start')
        AdlibUnRegister('Cout_Time')
EndIf
EndFunc
Func Cout_Time()
;$index = ...
$dif = TimerDiff ($begin)
_GuiCtrlListView_SetItemText($listview, $index, $dif, 6)
EndFunc

acetaohai123 发表于 2011-12-3 23:27:58

AdlibRegister怎么传参数呢?我是选定了一个ListViewItem之后要修改制定ListViewItem项目的时间值,不过AdlibRegister确实是一个好方法

user3000 发表于 2011-12-3 23:30:40

回复 3# acetaohai123


    可以考虑,点击按钮后, 就给必要的变量进行赋值吧

hualer 发表于 2011-12-4 11:05:34

学习一下学习一下

dnbj2010 发表于 2011-12-4 12:00:17

可以在子循环中增加对按钮动作的判断Func Count_Time($begin,$Index)
        While 1
                Sleep(1)
                $CInfo = GUIGetCursorInfo ($Form1)
                If $CInfo = 1 And $CInfo=$Button2 Then Return; $Button2停止键ID
               
                $dif = TimerDiff($begin)
                _GUICtrlListView_SetItemText($listview, $Index, $dif, 6)
        WEnd
EndFunc

acetaohai123 发表于 2011-12-4 12:54:08

不太理想,哎,还是先看看高手的作品找思路把

风行者 发表于 2011-12-4 18:52:20

可以设置一个开关,循环体放到主程序里

风行者 发表于 2011-12-4 18:53:06

或者WM_COMMAND 消息

gto250 发表于 2011-12-5 19:24:15

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
Dim $i=0
$Form1 = GUICreate("Form1", 415, 155, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")

$Label1 = GUICtrlCreateLabel("Label1", 48, 16, 316, 17)

$Button1 = GUICtrlCreateButton("开始/停止", 88, 64, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
$Button2 = GUICtrlCreateButton("点我试试", 176, 64, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
GUISetState(@SW_SHOW)
$begin=TimerInit()
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
        If $i=1 Then

        $dif = TimerDiff($begin)
        GUICtrlSetData($Label1,$dif)
        EndIf
WEnd

Func Button1Click()
If $i=0 Then
$i=1
Else
        $i=0
        EndIf
EndFunc
Func Button2Click()
MsgBox(0,0,"试试")
EndFunc
Func Form1Close()
Exit
EndFunc

happytc 发表于 2011-12-6 08:30:42

我知道用Opt("GUIOnEventMode",1)事件模型来避免死循环不响应按钮的问题。
现在的问题是,我想要点击一个开 ...
acetaohai123 发表于 2011-12-3 22:09 http://www.autoitx.com/images/common/back.gif

这个是au3的硬伤,不能多线程。
虽然可以跳出死循环,但一旦跳出了,原循环就暂停了,而你举的例子里循环又是不能暂停的时间,虽然可以用AdlibRegister勉强应对一下,但这样就造成计时不准确了。

dnbj2010 发表于 2011-12-6 09:11:35

这个是au3的硬伤,不能多线程。
虽然可以跳出死循环,但一旦跳出了,原循环就暂停了,而你举的例子里循 ...
happytc 发表于 2011-12-6 08:30 http://www.autoitx.com/images/common/back.gif

-----------------------------------------
不知道想达到怎样的准确性?
是不受电脑系统时间影响的独立时间?
能不能这样,在退出原循环的条件触发时,记录原循环时间与即时电脑系统时间的差值
当原循环再次启动时,再捕捉即时电脑系统时间,然后加上差值。
或者退出原循环时,启动一个定时器来计数....

applesin 发表于 2011-12-7 21:37:52

学习一下学习一下
学习一下学习一下
页: [1]
查看完整版本: 求助关于死循环