itljl 发表于 2010-7-12 19:26:32

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

本帖最后由 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就没有这个问题。

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

itljl 发表于 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能够自如操作,如移动窗口等。

pusofalse 发表于 2010-7-12 21:45:00

Bing614兄不是发了一个多线程ping吗,把那个改成UDF调用好了。

republican 发表于 2010-7-12 21:50:08

4楼的办法才是根本解决之道。

当然了,也可以用CMD来ping,读回显吧....

akmm88 发表于 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这样算不算呢?给分,哈哈.本来想一天回一贴,今天已经第二贴了

itljl 发表于 2010-7-13 13:05:13

回复 6# akmm88

确实好很多,兄弟这是什么原理呢?

akmm88 发表于 2010-7-15 13:05:45

执行死循环时,必须抽时间来处理GUIGetMsg()
如果WINDOWS发到你窗口的消息未被接收,窗口处于未响应.
If Mod($j,64)=0 Then 处理64次的窗口消息,才做一次PING命令
窗口消息很频繁的,比如鼠标在上面移动.会不断的产生mousemove消息.
页: [1]
查看完整版本: [已解决]除了多进程,还有什么方式让这个GUI不卡?