VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: aspirinum

关于循环等待问题

[复制链接]

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-15 12:15:01 | 显示全部楼层
楼上的不能嵌套,很吃惊阿,发一个嵌套的例子让大家学习一下可以吗??
回复

使用道具 举报

3

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
 楼主| 发表于 2020-8-16 16:15:01 | 显示全部楼层
我的程序里肯定有嵌套的(而且很多),只是在很少的机器中会出现这样的情况,但有的重做一遍系统后好了,有的还是不行。我猜想有可能是DoEvents使用不当引起的。
回复

使用道具 举报

3

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
 楼主| 发表于 2020-8-16 16:30:02 | 显示全部楼层
我的部分代码在“高分求助:关于doevents的问题,在线等!“帖子中,是.net的代码,不过没有太大区别,在vb6中也出现这种情况了,有一个版本用多线程的方式实现,一个UI线程,一个工作线程,目前还没有发现问题,这个是旧版的程序,没有时间大改。只能请各位高手帮助分析一下可能原因及解决方法。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-18 12:45:01 | 显示全部楼层
sub delay(delaytime)
dim start
start=timer
do while timer<start+delaytime
doevents
loop
end sub
doevents会导致程序执行效率降低
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-18 13:30:01 | 显示全部楼层
我真的很吃惊阿,用了好几年VB了,还从来不知道DoEvents会有问题呢

“DoEvents会导致程序执行效率降低”,我的理解是:“DoEvents本来就是要你的程序执行效率降低的”,应该知道的是,在循环里,每执行一次DoEvents,你的程序就会释放你的cpu控制权(当然这是在你的特权等级范围内),此时,你的程序还有系统就会检查是否还有其他需要cpu的地方,执行完其他请求后cpu会回到DoEvents后面的语句继续执行。

话说回来了,如果你的程序脆弱到DoEvents(即时在循环里)都会影响你的性能的话,问题往往是你的代码不过好。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-18 17:15:01 | 显示全部楼层
呵呵,也不一定,cpu不够好,程序执行效率也会很低。。。doevents 是让程序脱离闲置循环,从某种意义上说,会让程序更健康。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-18 18:00:02 | 显示全部楼层
1、等待小于3秒,对于用户来说可以说是没有反应;
2、等待3~5秒,对于用户来说,可以忍受,可以可以通过鼠标(沙漏)来显示;
3、等待5~10秒,对于用户来说,是忍受的上限,可以通过状态栏、鼠标状态等来显示信息;
4、等待10秒以上,对于用户来说,是无法忍受的,需要设置一个信息显示窗口来显示给用户。

自己总结,有不同意见的可以提出来。
回复

使用道具 举报

1

主题

21

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-8-18 18:15:01 | 显示全部楼层
我同意上面的说法,我用过如下的方法解决等待
1,鼠标沙漏
2,doevents
3, 进度条或者提示窗口
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-19 10:15:01 | 显示全部楼层
doevents在很多时候是必需的,如果你不用多线程。你的一个过程要处理大量数据(几百M到几G)。比如复制文件现在的计算机最快也就5-8M字节/秒因为这肯定要用到磁盘一般计算机没有这么大的内存,500M就要2分钟,让用户面对一个沙漏??是可以,但是程序由于得不到系统资源将会向死机一般没有响应!各种界面也不能刷新进度条也不会有任何改变因为你的程序也没有资源可用。大家可以试验一下。在Form_Load开头加入两条线中间的部分看看.
Private Sub Form_Load()
'---------------------------------------------
Dim i As Date
i = Now
i = DateAdd("s", 15, i)'等待15秒看看是不是很郁闷
Me.Visible = True
Do
     If i < Now Then Exit Do
     'DoEvents
Loop While 1
me.Caption="循环完毕"
'----------------------------------------------
'...其他的语句
End Sub
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-8-19 10:30:01 | 显示全部楼层
这个应该是Doevents嵌套的例子.最长等待25秒耐心的等
Private Sub Form_Click()
Static ptr As Integer, i As Date
i = Now: ptr = ptr + 1
If ptr > 4 Then Exit Sub
i = DateAdd("s", 5, i)
Me.Print Time
Me.MousePointer = 11
Do
     If i < Now Then Exit Do
     'DoEvents
Loop While 1
Me.Print "循环结束"
Me.MousePointer = 0
End Sub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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