为什么 在循环中加入了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


...全文
413 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,721

社区成员

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

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