getstr88 发表于 2022-6-28 16:58

C# winForm 中,界面不得已,每时每刻都在实时更新UI,这时用户对其他控件的操作很难

在新线程中处理一批图片,在主界面label中实时显示当前处理了多少个,新线程中每处理一个,invoke主线程去更新label显示

但遇到了这样的问题: 因为处理每个图片都很快,主界面就一直修改label显示进行更新。然后表现为,如果用户点击其他按钮,会发现点击动画都还在,并不卡。但是响应不了,得非常非常快的点,点好多次,才能偶尔碰上不更新label时,能响应

这个问题有办法解决么?还是winForm只能这样子。在他频繁刷新界面时,就是没法响应用户自己操作了?

zohoChou 发表于 2022-6-28 17:05

多线程?或者弄两个窗口但显示时看着像一个(doge

popdes 发表于 2022-6-28 17:27

本帖最后由 popdes 于 2022-6-28 17:29 编辑

C#下的防抖函数-Debounce, 节流函数-throttle

getstr88 发表于 2022-6-28 17:29

本帖最后由 getstr88 于 2022-6-28 17:34 编辑

popdes 发表于 2022-6-28 17:27
C#下的防抖函数-Debounce
不不,不能改变只要有1次变化,就要刷新界面显示一次的前提。不能合并成比如处理10张,再改一次UI。

并且就算改为1000张才刷新一次UI,也可能正好碰上代码要刷新界面时,导致用户点击失效把

getstr88 发表于 2022-6-28 17:30

zohoChou 发表于 2022-6-28 17:05
多线程?或者弄两个窗口但显示时看着像一个(doge

UI只会在UI主线程更新,再多线程有啥用

popdes 发表于 2022-6-28 17:34

getstr88 发表于 2022-6-28 17:29
有这个东西么?搜了下是js的?

感觉你这个不是防抖(防多次触发), 应该是节流(降低频率)
你这个一直疯狂刷新会导致防抖一直执行不了刷新, 所以应该是节流
百度上都是自己实现原理 ,可以复制.

getstr88 发表于 2022-6-28 17:35

popdes 发表于 2022-6-28 17:34
感觉你这个不是防抖(防多次触发), 应该是节流(降低频率)
你这个一直疯狂刷新会导致防抖一直执行不了刷新 ...

要求必须实时显示的呢。不能减少刷新UI的频率

popdes 发表于 2022-6-28 17:38

本帖最后由 popdes 于 2022-6-28 17:41 编辑

getstr88 发表于 2022-6-28 17:35
要求必须实时显示的呢。不能减少刷新UI的频率
刷的快你肉眼也看不清啊?
很多界面上实时刷新都是降频, 降频不代表值不是最新, 你每次暂停还是最新那个值,
节流: 就是规定时间内只执行最后一次给的值

一般操作是:
开个定时器, 比如50ms刷一次值.
你处理图片线程里用变量来计数处理了几个了., 然后定时器到时间取一次值...

getstr88 发表于 2022-6-28 17:41

本帖最后由 getstr88 于 2022-6-28 17:43 编辑

popdes 发表于 2022-6-28 17:38
刷的快你肉眼也看不清啊?
很多界面上实时刷新都是降频, 降频不代表值不是最新, 你每次暂停还是最新那个 ...
我试了下,看的清楚。数字从1一直增长上去,可以看清每个数字变动。其实也不算快。但是因为界面刷新还算快。此时,想点到其他按钮什么的,就很难了

我理解兄弟说的降频,就是一定时间内省去中间几次结果的显示。但是,甲方不同意的。合同上写的很清楚,必须每次进度变动都实时显示

popdes 发表于 2022-6-28 17:43

本帖最后由 popdes 于 2022-6-28 17:44 编辑

getstr88 发表于 2022-6-28 17:41
我试了下,看的清楚。数字从1一直增长上去,可以看清每个数字变动。其实也不算快。但是因为界面刷新还算 ...
一般操作是:
开始执行->然后
开个定时器, 比如50ms刷一次值.
你处理图片线程里用变量来计数处理了几个了., 然后定时器到时间取一次值...

感觉你做的东西估计用labview应该更好, 这个貌似是并行实时系统:lol
页: [1] 2 3 4 5
查看完整版本: C# winForm 中,界面不得已,每时每刻都在实时更新UI,这时用户对其他控件的操作很难