为什么 在循环中加入了DoEvents,cpu依然占用100%

ttsffgg 2014-04-03 09:19:00
环境vs2012, .net Farmework 4.0

新建一个工程,窗体代码如下

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Do
Application.DoEvents()
Loop
End Sub
End Class


问题
为什么 在循环中加入了DoEvents,cpu依然占用100%

谢谢


如果我这个循环是为了检测一个值是否达到条件,达到条件则继续之后的代码.没达到条件则一直卡在这个循环中,应该如何写呢?
我当前的代码是这样的

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Do
if (一个判断条件的表达式) then exit do
Application.DoEvents()
Loop

'这里是之后的代码
End Sub
End Class


...全文
397 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 caoqinghua 的回复:
[quote=引用 6 楼 overown 的回复:] 其实这里我就是在等待一个BackgroundWorker对象的线程结束
执行方法以前先将界面enable=false 然后等待 backgroundWorker1的RunWorkerCompleted,完成后 界面 enable=true[/quote] 等待直到另一个线程结束后再继续后续动作,可使用线程中的WaitOne()方法。VS帮助当中有相关示例如下:

Public Class WaitOne

    Shared autoEvent As New AutoResetEvent(False)

    <MTAThread()> _
    Shared Sub Main()
        Console.WriteLine("Main starting.")

        ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)

        ' Wait for work method to signal.
        autoEvent.WaitOne()
        Console.WriteLine("Work method signaled.")
        Console.WriteLine("Main ending.")
    End Sub

    Shared Sub WorkMethod(ByVal stateInfo As Object)
        Console.WriteLine("Work starting.")

        ' Simulate time spent working.
        Thread.Sleep(New Random().Next(100, 2000))

        ' Signal that work is finished.
        Console.WriteLine("Work ending.")
        CType(stateInfo, AutoResetEvent).Set()
    End Sub

End Class
vbfool 2014-04-08
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
真正去去设计一个敏捷的流程,就是不要使用Do...Loop循环。
觉得IOCP是好东西,但是.NET里似乎也只看到Socket用到了,用Task做回调模式也不错,但是总感觉自己写的太蛋疼。
  • 打赏
  • 举报
回复
真正去去设计一个敏捷的流程,就是不要使用Do...Loop循环。
skyworth98 2014-04-07
  • 打赏
  • 举报
回复
引用 5 楼 vbfool 的回复:
[quote=引用 4 楼 overown 的回复:] 试了一下 看来这样用才行 Application.DoEvents() Thread.Sleep(1) 如果只用Application.DoEvents()无法降低CPU使用率 如果只用Thread.Sleep()界面会假死
这种费力气的事情,请新开一个线程去处理,并且在线程里适当Sleep,这样不会影响UI响应,数据处理完毕时,通过Dispatcher传回UI线程来进行显示。[/quote] sp
vbfool 2014-04-04
  • 打赏
  • 举报
回复
BackgroundWorker本身就有结束事件,在那个事件里做处理不就是了,干嘛还要循环去等待呢。
vbfool 2014-04-03
  • 打赏
  • 举报
回复
引用 4 楼 overown 的回复:
试了一下 看来这样用才行 Application.DoEvents() Thread.Sleep(1) 如果只用Application.DoEvents()无法降低CPU使用率 如果只用Thread.Sleep()界面会假死
这种费力气的事情,请新开一个线程去处理,并且在线程里适当Sleep,这样不会影响UI响应,数据处理完毕时,通过Dispatcher传回UI线程来进行显示。
ttsffgg 2014-04-03
  • 打赏
  • 举报
回复
试了一下 看来这样用才行 Application.DoEvents() Thread.Sleep(1) 如果只用Application.DoEvents()无法降低CPU使用率 如果只用Thread.Sleep()界面会假死
threenewbee 2014-04-03
  • 打赏
  • 举报
回复
Thread.Sleep(100)
caoqinghua 2014-04-03
  • 打赏
  • 举报
回复
引用 6 楼 overown 的回复:
其实这里我就是在等待一个BackgroundWorker对象的线程结束
执行方法以前先将界面enable=false 然后等待 backgroundWorker1的RunWorkerCompleted,完成后 界面 enable=true
ttsffgg 2014-04-03
  • 打赏
  • 举报
回复
那如果我想这个循环慢一点,不要占用那么多的cpu,同时不使界面出现假死状态应该怎么办呢?
宝_爸 2014-04-03
  • 打赏
  • 举报
回复
DoEvents应该是循环的间隙,处理下消息。所以CPU占有率还是很高。
ttsffgg 2014-04-03
  • 打赏
  • 举报
回复
引用 5 楼 vbfool 的回复:
[quote=引用 4 楼 overown 的回复:] 试了一下 看来这样用才行 Application.DoEvents() Thread.Sleep(1) 如果只用Application.DoEvents()无法降低CPU使用率 如果只用Thread.Sleep()界面会假死
这种费力气的事情,请新开一个线程去处理,并且在线程里适当Sleep,这样不会影响UI响应,数据处理完毕时,通过Dispatcher传回UI线程来进行显示。[/quote] 其实这里我就是在等待一个BackgroundWorker对象的线程结束

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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