p7749 发表于 2018-8-28 15:52:57

为什么加入的是1秒 要等15秒才反应

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 623, 442, 192, 124)
$Button1 = GUICtrlCreateButton("Button1", 344, 256, 121, 49)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        If $nMsg = $GUI_EVENT_CLOSE Then Exit
        If $nMsg = $Button1 Then MsgBox(0,"","ok")

        Sleep(1000);为什么加入的是1秒 要等15秒才反应
WEnd

志艺风云 发表于 2018-8-28 17:07:40

While 会不停地循环,每循环一次等1秒(每次循环也有间隔时间),显示窗口到响应点击按钮时可能要循环十多次吧。

顽固不化 发表于 2018-8-28 16:40:23

从点击到运行要经过好几个坎,比如要把某些系统库调进内存,比如还要经过安全软件的检查,等等,

p7749 发表于 2018-8-28 16:55:43

顽固不化 发表于 2018-8-28 16:40
从点击到运行要经过好几个坎,比如要把某些系统库调进内存,比如还要经过安全软件的检查,等等,

你是混分的吧2楼改成1毫秒就迅速反应都是同样的坎

顽固不化 发表于 2018-8-28 17:22:36

p7749 发表于 2018-8-28 16:55
你是混分的吧2楼改成1毫秒就迅速反应都是同样的坎

是的,我基本混个分分玩玩,现在下载需要大量的分分{:face (197):}

p7749 发表于 2018-8-28 17:57:33

志艺风云 发表于 2018-8-28 17:07
While 会不停地循环,每循环一次等1秒(每次循环也有间隔时间),显示窗口到响应点击按钮时可能要循环十多 ...

感觉有道理 是被等待了

顽固不化 发表于 2018-8-28 18:48:37

本帖最后由 顽固不化 于 2018-8-28 18:55 编辑


进行模拟点击测试,最多一次等了将近半分钟。
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SMT.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1_test", 623, 442, 192, 124)
$Button1 = GUICtrlCreateButton("Button1", 344, 256, 121, 49)
$BL = GUICtrlCreateLabel('', 50, 50, 200, 20)
GUICtrlCreateLabel('SLEEP(1000)所用时间!', 250, 50, 200, 20)
$BL0 = GUICtrlCreateLabel('', 50, 80, 200, 20)
GUICtrlCreateLabel('一个循环所用时间', 250, 80, 200, 20)
$BL1 = GUICtrlCreateLabel('', 50, 110, 200, 25)
GUICtrlCreateLabel('模拟点击后等待时间', 250, 110, 200, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$time = 0
$time0 = 0

AdlibRegister('showtime', 100)
$pid = _CreateThread('hahaha')
While 1
      $test0 = TimerInit()
      $nMsg = GUIGetMsg()
      If $nMsg = $GUI_EVENT_CLOSE Then Exit
      If $nMsg = $Button1 Then MsgBox(0, "hahaha", "ok")
      $test = TimerInit()
      Sleep(1000);为什么加入的是1秒 要等15秒才反应
      $time = TimerDiff($test)
      $time0 = TimerDiff($test0)
WEnd

Func showtime()
      GUICtrlSetData($BL0, $time0)
      GUICtrlSetData($BL, $time)
EndFunc   ;==>showtime

Func hahaha()
      While 1
                ControlSetText('Form1_test', '', 'Static5', '2秒后开始模拟点击!')
                Sleep(2000)
                ControlClick('Form1_test', '', 'Button1')

chamlien 发表于 2018-8-28 22:23:36

这是个比较神奇的问题,在sleep下一行加一个ConsoleWrite("" & @CRLF),发现每隔一秒都进行打印,但点击事件却延迟10秒左右,而改成sleep(10)却没有影响,为什么呢?
原因在于sleep是阻塞线程,它可能会与当前线程抢占CPU资源,属于占用状态,1秒之内主线程可能还未捕获到点击事件,又进入到了sleep线程,等到点击事件唤醒主线程后,可能就是15秒后的事情了。
也可以在$nMsg = GUIGetMsg()上一行添加一句ControlClick($Form1, '', $Button1),你会发现,msgbox有时15秒后弹出,有时1秒之内就可以弹出,所以说在while循环体下,慎用长时间sleep,毕竟AU3是单线程程序。
       

nmgwddj 发表于 2018-8-29 14:01:05

一个简单例子,虽然不能涵盖内部细节,但是我觉得已经比较形象。
消息是有一个队列的,所有窗口消息在不断的往队列中填充新的消息,但你取出消息却是一秒一次,当你把鼠标放到这个窗口的时候有鼠标进入的消息,鼠标移动到按钮上的时候有鼠标移动消息,直到鼠标按下和弹起以后才会触发 MsgBox,在鼠标弹起前可能有 10 个消息已经在队列中,你要等 10 秒,如果已经有 100 个消息在队列中,你要等 100 秒。这个时间并不是固定的。不信你可以在窗口上先移动一段时间鼠标,而不点击按钮(此时会在队列中有很多鼠标移动的消息等着被取出),再点击按钮会等很久很久,因为前面排列了很多鼠标移动的消息。




页: [1]
查看完整版本: 为什么加入的是1秒 要等15秒才反应