anythinging 发表于 2023-12-24 17:50:04

更新到3.16.1后遇到个响应按钮延迟显示小问题

这段代码之前在3.14.5一直很正常,在升级3.16.1后遇到了个响应按钮延迟显示的问题:点击按钮后不更新显示,需要点下gui才能正常显示输入的值。

目前的解决方法是:去掉_rev函数中的do unitl,while,增加sleep(10)

还请各位帮看下,我这代码是不是有问题,怎么改才能正常?或者更好的代码写法?

opt('GUIOnEventMode',1)

$gui = GUICreate("test",200,100)
GUISetOnEvent(-3,'_exit')

$bt = GUICtrlCreateButton("test",100,60)
GUICtrlSetOnEvent(-1,'_bt')
$input = GUICtrlCreateInput("0",50,20,100,20)
GUISetState()
$a = 0

TCPStartup()
Local $sIPAddress = "127.0.0.1"
Local $iPort = 65432
Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)

While 1

        _rev()

        Sleep(10)
WEnd

_exit()

Func _rev()
        Local $iSocket = 0
        Do
                $iSocket = TCPAccept($iListenSocket)
        Until $iSocket <> -1
EndFunc

Func _bt()
        $a += 1
        GUICtrlSetData($input,$a)
EndFunc

Func _exit()
        TCPShutdown()
        Exit
EndFunc



afan 发表于 2023-12-24 18:16:55

本帖最后由 afan 于 2023-12-24 22:38 编辑

这样可行?
Func _rev()
      Local $iSocket = 0
      $iSocket = TCPAccept($iListenSocket)
      Sleep(10)
      While $iSocket = -1
                $iSocket = TCPAccept($iListenSocket)
      WEnd
EndFunc   ;==>_rev

anythinging 发表于 2023-12-24 21:53:04

afan 发表于 2023-12-24 18:16
这样可行?

有效果,但是没太弄懂While $iSocket <> -1时,循环运行的意义
我又重新修改下了,
Func _rev()
        Local $iSocket = 0
        $iSocket = TCPAccept($iListenSocket)

        If $iSocket <> -1 Then
                ;........................
        Else
                Return False
        EndIf
EndFunc

anythinging 发表于 2023-12-24 21:54:29

还想请教下a版,我最开始发的_rev()有什么问题或隐患吗?

afan 发表于 2023-12-24 22:37:46

anythinging 发表于 2023-12-24 21:53
有效果,但是没太弄懂While $iSocket-1时,循环运行的意义
我又重新修改下了,
...

笔误,应该是 = -1才是~

afan 发表于 2023-12-24 22:48:06

本帖最后由 afan 于 2023-12-24 22:57 编辑

两层循环监听确实没必要,3#那样就行了。只是TCPAccept 始终 Sleep(10) 可能会有有疏漏。
很久没用TCP这些了,忘得差不多了~

3.3.16.1 我也没用,你这反馈的问题感觉也是 3.3.16.1 的问题,似乎有阻塞现象。

hlcheng 发表于 2023-12-27 08:44:24

不太清楚,具体是哪里的问题

gyp2000 发表于 2023-12-31 03:58:08

本帖最后由 gyp2000 于 2023-12-31 03:59 编辑

Func _rev()
      Local $iSocket = 0
      Do
                $iSocket = TCPAccept($iListenSocket)
      Until $iSocket <> -1
EndFunc
这里是死循环,所以不响应GUI

加个休眠指令就好了

Func _rev()
      Local $iSocket = 0
      Do
                Sleep(1)
                $iSocket = TCPAccept($iListenSocket)
      Until $iSocket <> -1
EndFunc   ;==>_rev

anythinging 发表于 2023-12-31 11:11:42

gyp2000 发表于 2023-12-31 03:58
Func _rev()
      Local $iSocket = 0
      Do


对,是这样的,我问题描述里就是这样弄的。不过这个情况只出现 在3.16.1,中英文版都是相同情况

afan 发表于 2023-12-31 11:28:56

没有sleep(1) 的,最少10起步…… 建议用回旧版

gyp2000 发表于 2023-12-31 23:53:31

这可能是TCPAccept 函数引起的。
具体原因还需要检查TCPAccept函数执行效率。

循环执行一个网络函数。本来就应该导致GUI无响应。可能旧版本的这个函数在执行的时候存在休眠的问题。新版本执行效率更高。当然这种猜想还需要跑代码验证一下。 循环执行1000次函数耗时对比测试。

gyp2000 发表于 2024-1-1 00:25:18

经过测试 如果使用winapi实现 accept 函数 3.14.5和3.16.1 都会卡GUI。

3.14.5版本中的TCPAccept函数的确不会卡GUI,原因未知。

afan 发表于 2024-1-1 11:00:45

问题很明显的,之前的任何版本都正常,特意用很老的 3.3.6.1 都测试正常,只有 3.3.16.1 有问题。阻塞明显且贯穿始终,点击后也没有恢复正常,在输入框的光标也是异常。

anythinging 发表于 2024-1-4 13:26:37

afan 发表于 2024-1-1 11:00
问题很明显的,之前的任何版本都正常,特意用很老的 3.3.6.1 都测试正常,只有 3.3.16.1 有问题。阻塞明显 ...
请教版主,您这个多版本测试是怎么实现的?
一点就换了个版本,太历害了!

afan 发表于 2024-1-4 13:39:34

anythinging 发表于 2024-1-4 13:26
请教版主,您这个多版本测试是怎么实现的?
一点就换了个版本,太历害了!



AuVerManage 发布都快十年了…
页: [1]
查看完整版本: 更新到3.16.1后遇到个响应按钮延迟显示小问题