找回密码
 加入
搜索
查看: 1559|回复: 9

[AU3基础] 为什么加入的是1秒 要等15秒才反应

[复制链接]
发表于 2018-8-28 15:52:57 | 显示全部楼层 |阅读模式
#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

评分

参与人数 1金钱 -20 收起 理由
afan -20

查看全部评分

发表于 2018-8-28 17:07:40 | 显示全部楼层
While 会不停地循环,每循环一次等1秒(每次循环也有间隔时间),显示窗口到响应点击按钮时可能要循环十多次吧。
发表于 2018-8-28 16:40:23 | 显示全部楼层
从点击到运行要经过好几个坎,比如要把某些系统库调进内存,比如还要经过安全软件的检查,等等,
 楼主| 发表于 2018-8-28 16:55:43 | 显示全部楼层
顽固不化 发表于 2018-8-28 16:40
从点击到运行要经过好几个坎,比如要把某些系统库调进内存,比如还要经过安全软件的检查,等等,

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

点评

我理解错了,我以为你说的是启动程序慢  发表于 2018-8-28 17:31
发表于 2018-8-28 17:22:36 | 显示全部楼层
p7749 发表于 2018-8-28 16:55
你是混分的吧2楼  改成1毫秒就迅速反应都是同样的坎

是的,我基本混个分分玩玩,现在下载需要大量的分分
 楼主| 发表于 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')

发表于 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是单线程程序。
       

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

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

本版积分规则

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

GMT+8, 2024-12-23 23:35 , Processed in 0.085201 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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