找回密码
 加入
搜索
查看: 3707|回复: 7

[GUI管理] [已解决]除了多进程,还有什么方式让这个GUI不卡?

  [复制链接]
发表于 2010-7-12 19:26:32 | 显示全部楼层 |阅读模式
本帖最后由 itljl 于 2010-8-18 12:29 编辑
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 259, 83, 192, 114)
$Label1 = GUICtrlCreateLabel("测试测试测试测试测试测试", 64, 24)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

For $i = 1 To 254
        $var = Ping("192.168.0." & $i)
        GUICtrlSetData($Label1, "192.168.0." & $i & " Re: " & $var & " ms")
Next


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
WEnd
比如上面的代码,在PING的过程中,GUI是相当卡的,连移动窗口都不很卡,鼠标一放上去就显示忙。有没有除了多进程之外,解决这种在PING或者其它函数执行过程中,GUI不卡的办法吗?

比如,在CMD中ping就没有这个问题。
发表于 2010-7-12 20:45:47 | 显示全部楼层
首先强调,这个不是GUI的问题
是PING的问题

你单独运行这段代码,也会很慢的
For $i = 1 To 254
        $var = Ping("192.168.0." & $i)
Next

给点思路你,其余自己去发挥吧
既然是ping内网,那么ping一次就够了,数据包也可小点,且timeout在50之类
更改ping的设置为  
ping -n 1 -l 16 -w 50
 楼主| 发表于 2010-7-12 21:36:48 | 显示全部楼层
本帖最后由 itljl 于 2010-7-12 21:38 编辑

回复 2# bob
你好,谢谢回复。
就算是ping,1 (超时在1MS)也会卡的。
当然我说的卡,不是指这个ping 不应该卡,只是我们发现在cmd中ping的话,就算超时是4S,CMD窗口也能自由移动。
所以我想讨论的是,在AU3中,有什么办法在一些函数如ping,在执行时需要较长时间来反应的情况下,GUI能够自如操作,如移动窗口等。
发表于 2010-7-12 21:45:00 | 显示全部楼层
Bing614兄不是发了一个多线程ping吗,把那个改成UDF调用好了。
发表于 2010-7-12 21:50:08 | 显示全部楼层
4楼的办法才是根本解决之道。

当然了,也可以用CMD来ping,读回显吧....
发表于 2010-7-13 10:38:43 | 显示全部楼层
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 259, 83, 192, 114)
$Label1 = GUICtrlCreateLabel("测试测试测试测试测试测试", 64, 24)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$i=1
;For $i = 1 To 254
        ;$var = Ping("192.168.0." & $i)
        ;GUICtrlSetData($Label1, "192.168.0." & $i & " Re: " & $var & " ms")
;Next

$j=0
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit

        EndSwitch
                If Mod($j,64)=0 Then
                If $i<=254 Then
                $var = Ping("192.168.0." & $i,100)
        GUICtrlSetData($Label1, "192.168.0." & $i & " Re: " & $var & " ms")
                $i=$i+1
            EndIf
        EndIf
        If $j<20000 Then
        $j=$j+1 
        EndIf
        
WEnd
这样算不算呢?给分,哈哈.本来想一天回一贴,今天已经第二贴了

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
itljl + 10 + 1

查看全部评分

 楼主| 发表于 2010-7-13 13:05:13 | 显示全部楼层
回复 6# akmm88

确实好很多,兄弟这是什么原理呢?
发表于 2010-7-15 13:05:45 | 显示全部楼层
执行死循环时,必须抽时间来处理GUIGetMsg()
如果WINDOWS发到你窗口的消息未被接收,窗口处于未响应.
If Mod($j,64)=0 Then 处理64次的窗口消息,才做一次PING命令
窗口消息很频繁的,比如鼠标在上面移动.会不断的产生mousemove消息.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-12 00:19 , Processed in 0.082566 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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