在vb执行某段程序的时候,需要几分钟时间,如何出现等待的进度条?

ruan1978 2021-04-20 01:46:19
我在vb.net中,有以下一段程序代码,调用的时候,需要执行几分钟才结束,如果没有出现提示,客户会认为程序死了,不响应了,想问下这段代码执行的时候,如何出现进度条或者其他的动态提示,以提醒客户程序还在运行。
private sub ProcessProcedure()
...
...
End Sub
就是调用这段代码的时候,执行需要几分钟,请问如何捕获这个时间,让进度条友好提示。
...全文
2125 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
不懂别说哎 2021-04-30
  • 打赏
  • 举报
回复
除了浪费CPU和内存
赵4老师 2021-04-29
  • 打赏
  • 举报
回复
3、啥也确认不了的,给个会动的东西就行。
ruan1978 2021-04-29
  • 打赏
  • 举报
回复
[quote=引用 14 楼 赵4老师 的回复:]3、啥也确认不了的,给个会动的东西就行。 [/quot] 通过两个timer+progressbar来实现? 一个timer设置需要多久, 另外一个timer设置时间间隔
脆皮大雪糕 2021-04-28
  • 打赏
  • 举报
回复
引用 11 楼 ruan1978 的回复:
[quote=引用 10 楼 赵4老师 的回复:]如果知道大概比如10分钟,可以在执行中每隔比如10秒DoEvents() 然后添加Timer,在Timer_Events中根据经过的时间显示对应百分比的进度条
这个时间不确定,怎么办?[/quote] 无非集中情况: 1、确定时间以及当前已经消耗的时间,根据时间计算百分比,比如强制等待20秒。 2、确定工作量以及当前已完成的工作量,根据工作量计算百分比,比如拷贝10个文件,但这时候9个文件都是5K的,第10个文件是5G的,等待时间就不是那么线性。 3、啥也确认不了的,给个会动的东西就行。 以上三种情况,要么在大循环或者处理间隙里让进度条或者图片啥的动一下,要不然就是起一个和主任务不同的线程来让他展示。
赵4老师 2021-04-25
  • 打赏
  • 举报
回复
如果知道大概比如10分钟,可以在执行中每隔比如10秒DoEvents() 然后添加Timer,在Timer_Events中根据经过的时间显示对应百分比的进度条
赵4老师 2021-04-25
  • 打赏
  • 举报
回复
引用 11 楼 ruan1978 的回复:
[quote=引用 10 楼 赵4老师 的回复:]如果知道大概比如10分钟,可以在执行中每隔比如10秒DoEvents() 然后添加Timer,在Timer_Events中根据经过的时间显示对应百分比的进度条
这个时间不确定,怎么办?[/quote] 差不多就行。 为避免进度条到100%了,处理还长时间不完,可让进度条最多到95%,等处理完了再显示为100%,然后过比如两秒再隐藏进度条。
ruan1978 2021-04-25
  • 打赏
  • 举报
回复
引用 10 楼 赵4老师 的回复:
如果知道大概比如10分钟,可以在执行中每隔比如10秒DoEvents() 然后添加Timer,在Timer_Events中根据经过的时间显示对应百分比的进度条
这个时间不确定,怎么办?
脆皮大雪糕 2021-04-22
  • 打赏
  • 举报
回复 1
引用 5 楼 ruan1978 的回复:
[quote=引用 4 楼 脆皮大雪糕 的回复:]这个长时间等待是因为你的循环导致的还是外部调用同步等待导致的?
想用进度条提示,就是想知道这段代码执行多长时间,然后用一个进度条显示。[/quote] 你还是没理解我的意思,我的意思是要区分你的情况属于下列哪种情况 1、你的处理里面有个大循环,这个循环很耗时,导致界面假死。 举个例子,你要处理100万条记录,于是你的代码从数据库里取到了这些数据,然后起了一个循环一条一条处理。这里的所有处理全是你的代码在折腾。你知道总的循环次数,你知道循环了几次了,那么你能算出当前循环进度,并能在每次循环的过程中更新进度条。 2、你的处理里面调用外部一个函数,这个函数运行很耗时,你把这个任务交给外部以后,必须同步阻塞等待返回结果,导致界面假死。 举个例子,你要处理100万条记录,这个处理逻辑是数据库里的一个复杂SQL语句或者是一个存储过程。你调用ADO或者ODBC或者别的啥,发了个指令去做这个处理,然后就阻塞等待。在数据库返回结果之前,你的程序不会执行下一行,于是整个系统处于假死状态。这种情况下,你无法得知处理进度,只能傻等,那么处理方法一般是给一个会动的东西,比如动画或者什么的,让用户觉得程序还活着。对于VB这种单线程的东西,这就涉及到,当前线程在傻等,你要再起一个线程去让有个东西动起来。一般是调用外部的DLL,起一个单元线程干这件事情。 3、你的处理里面调研弄外部一个函数,这个函数运行很耗时,但你把这个任务交给外部以后,可以异步等待。 举个例子,你要处理100万条记录,这个处理逻辑是数据库里的一个复杂SQL语句或者是一个存储过程。你调用ADO或者ODBC或者别的啥,发了个指令去做这个处理。对方说“OK,收到,这事情包在我身上了,你该干啥干啥去吧”。然后你的程序就可以继续往下跑了。接下来你要做的事情就是隔一段时间去看看或者问问处理好没有。这种情况又有两个分支:你可以查询到结果,和你可以查询到过程。 如果是前者,你只能问外部说:“刚才交给你的任务搞定没啊”对方回答:“催毛催,每完呢,一边等着去,待会儿再来问”,于是你能干的就是给客户一个笑脸(动画或者别的表示程序没死的方式)说:“烦劳您再等等,茶水还有么?我给您沏点热的”直到你问到外部已经就绪,就收了茶水跟客户说“您交代的事情办得嘞”。 如果是后者,你可以每隔一段时间问外部:“刚才交给你的任务做到哪了”,对方回答:“累了半死刚弄了五千多条”,与是你可以刷新一下进度条,告诉客户,目前进度0.5% 4、异步等待还有一种方式是外部调用隔一段时间反馈一个进度,用事件消息或者回调函数。 用上面的例子说就是,你任务交出去了,对方说收到,您等着,然后每隔一段时间回报:“老板,目前已经完成了XXX”,然后你翻译一下,在进度条上做个更新继续翘着二郎腿等它下一次反馈。
不懂别说哎 2021-04-22
  • 打赏
  • 举报
回复
嗯嗯,放一个进度条控件,进度提示功能也需要自己设计的,比如你将代码条分为10份,那就要你自己设计好这段代码执行到哪的时候算一份,这和运行时间完全无关,也就是说无论你用多少时间,只要执行到这个位置,进度条就走十分之一,这个其实很尴尬,如果你单纯的只是想让客户知道程序还在运行的话其实你需要注意的是程序的独占问题,也就是假死状态的处理,你只需要经常把钩子还给系统,就可以避免假死问题了, 举个例子,程序正在循环作业,这个时候本程序是不响应鼠标等其他任何操作,代码正在独占期,所以给用户的体验就相当于“死机”了似的,这个时候将系统钩子还给系统,系统就会在钩子执行时先处理外部的排队事件,都处理完后再接着跑代码,这样鼠标等操作就变的被响应了。 但是有一点需要特别注意的是,确保在钩子还给系统的时候“没有-没执行完成-的对系统参数的异步调用”因为程序钩子再还给系统的时候是强制性的,系统会执行目前排队等候的其他作业,在完成作业前钩子不会还给本程序,举个例子(不太恰当,但意思一样) 【假设你的程序正在访问一个系统级的变量,假设这个变量为0,这个时候你把钩子还给系统,系统会执行其他的排队作业,假设排队作业的任务里有一个其他程序也需要用到这个变量,并且会改变这个变量的值,这个时候把系统钩子还给系统是很危险的,比如我想做个加法循环100次,内容就是当前变量值B 加上 系统的变量 A,假设B=1,A=0,这个时候是执行100次 1+0 ,如果加上钩子返还,再假设在循环50次以后外部程序将系统变量A改成了1,这个时候你的程序就会变成50次1+0,和50次1+1,和你要的结果完全不一致】当然大多数不会遇见这样的问题,你可以在循环的位置加上DoEvents将钩子还给系统来解决进度条在FOR循环里的不理想显示进度的问题
ruan1978 2021-04-22
  • 打赏
  • 举报
回复
引用 7 楼 不懂别说哎 的回复:
楼主还以为进度条是自动化的呢
我没有说进度条是自动化的,窗体上放置progress这个控件,我知道的,大侠。
不懂别说哎 2021-04-22
  • 打赏
  • 举报
回复
楼主还以为进度条是自动化的呢
ruan1978 2021-04-21
  • 打赏
  • 举报
回复
引用 1 楼 不懂别说哎 的回复:
太笼统了
类似于执行某个操作时间比较久,用一个图片一直滚动或者进度条提示,不然客户会认为死机了。
不懂别说哎 2021-04-21
  • 打赏
  • 举报
回复
太笼统了
ruan1978 2021-04-21
  • 打赏
  • 举报
回复
引用 4 楼 脆皮大雪糕 的回复:
这个长时间等待是因为你的循环导致的还是外部调用同步等待导致的?
想用进度条提示,就是想知道这段代码执行多长时间,然后用一个进度条显示。
脆皮大雪糕 2021-04-21
  • 打赏
  • 举报
回复
这个长时间等待是因为你的循环导致的还是外部调用同步等待导致的?
不懂别说哎 2021-04-21
  • 打赏
  • 举报
回复
如果是一个命令慢是没有办法的,看不见代码没办法

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧