找回密码
 加入
搜索
查看: 253|回复: 14

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

[复制链接]
发表于 2023-12-24 17:50:04 | 显示全部楼层 |阅读模式
这段代码之前在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

发表于 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
 楼主| 发表于 2023-12-24 21:53:04 | 显示全部楼层

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

        If $iSocket <> -1 Then
                ;........................
        Else
                Return False
        EndIf
EndFunc
 楼主| 发表于 2023-12-24 21:54:29 | 显示全部楼层
还想请教下a版,我最开始发的_rev()有什么问题或隐患吗?
发表于 2023-12-24 22:37:46 | 显示全部楼层
anythinging 发表于 2023-12-24 21:53
有效果,但是没太弄懂While $iSocket  -1时,循环运行的意义
我又重新修改下了,
...

笔误,应该是 = -1才是~
发表于 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 的问题,似乎有阻塞现象。
发表于 2023-12-27 08:44:24 | 显示全部楼层
不太清楚,具体是哪里的问题
发表于 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
 楼主| 发表于 2023-12-31 11:11:42 | 显示全部楼层
gyp2000 发表于 2023-12-31 03:58
Func _rev()
        Local $iSocket = 0
        Do

对,是这样的,我问题描述里就是这样弄的。不过这个情况只出现 在3.16.1,中英文版都是相同情况
发表于 2023-12-31 11:28:56 | 显示全部楼层
没有sleep(1) 的,最少10起步…… 建议用回旧版
发表于 2023-12-31 23:53:31 来自手机 | 显示全部楼层
这可能是TCPAccept 函数引起的。
具体原因还需要检查TCPAccept函数执行效率。

循环执行一个网络函数。本来就应该导致GUI无响应。可能旧版本的这个函数在执行的时候存在休眠的问题。新版本执行效率更高。当然这种猜想还需要跑代码验证一下。 循环执行1000次函数耗时对比测试。
发表于 2024-1-1 00:25:18 | 显示全部楼层
经过测试 如果使用winapi实现 accept 函数 3.14.5和3.16.1 都会卡GUI。

3.14.5版本中的TCPAccept函数的确不会卡GUI,原因未知。
发表于 2024-1-1 11:00:45 | 显示全部楼层
问题很明显的,之前的任何版本都正常,特意用很老的 3.3.6.1 都测试正常,只有 3.3.16.1 有问题。阻塞明显且贯穿始终,点击后也没有恢复正常,在输入框的光标也是异常。

本帖子中包含更多资源

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

×
 楼主| 发表于 2024-1-4 13:26:37 | 显示全部楼层
afan 发表于 2024-1-1 11:00
问题很明显的,之前的任何版本都正常,特意用很老的 3.3.6.1 都测试正常,只有 3.3.16.1 有问题。阻塞明显 ...

请教版主,您这个多版本测试是怎么实现的?
一点就换了个版本,太历害了!

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

AuVerManage 发布都快十年了…
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-28 04:04 , Processed in 0.080493 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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