none
[VB.Net 2005] 請問一個有關 Application.DoEvents() 的問題哦! ( 謝謝! ) RRS feed

  • 問題

  •   我寫了一個很單純的簡單迴圈程式,為了防止 Form 會沒有反應,所以使用了 Application.DoEvents() !
      不過,雖然使用了 Application.DoEvents() 之後就可以讓 Form 有正常的反應了,但是【CPU 的使用率】卻都還一直是【100 %】耶,使用 Application.DoEvents() 好像並沒有真的暫時的釋放掉【CPU 的資源】的樣子耶,請問要如何解決這個問題呢!?

    ( 謝謝! )

     

    2006年12月3日 下午 08:34

解答

  • HI,

    您可以使用Thread或是BackgroundWorker來執行耗時的工作, 同時讓應用程式可以繼續對使用者的操作做出反應

    tihs

    2006年12月4日 上午 12:18
  • 我會建議在 DoEvents 前面或後面加個 Sleep

    Ex.

       Application.DoEvents()
       System.Threading.Thread.Sleep(1)

    2006年12月4日 上午 12:47
    版主

所有回覆

  • HI,

    您可以使用Thread或是BackgroundWorker來執行耗時的工作, 同時讓應用程式可以繼續對使用者的操作做出反應

    tihs

    2006年12月4日 上午 12:18
  • DoEvents只是讓程式去執行同執行緒裡面尚在等待的其他程式序列

    例如ReDraw、Timer的事件(事實上所有事件都會排在序列裡)

    所以當程式跑到DoEvents時會ReDraw,畫面並沒有停住,看起來好像迴圈停止了一樣

    實際上當其他程式序列都結束後,迴圈仍會繼續執行。

     

    若你真的要讓迴圈不佔用CPU資源...,最好的方法還是直接利用條件判斷式直接跳出迴圈

    懶一點的話可以試試用Timer配合外部變數模擬迴圈,調整Interval或Enabled來控制迴圈的速度或暫停

    不過十分不建議用這個方法...因為可能會有意想不到的錯誤發生,而且不容易除錯。

    另外,你有使用Timer時,呼叫DoEvents請格外小心...

     

    再者,你可以試試一些API的方法,我直覺想到的是把該程式的優先權調低...

    不過API我不熟,所以請樓下接力(?

    2006年12月4日 上午 12:33
  • 我會建議在 DoEvents 前面或後面加個 Sleep

    Ex.

       Application.DoEvents()
       System.Threading.Thread.Sleep(1)

    2006年12月4日 上午 12:47
    版主
  •   真的是非常的感謝您們的回答哦! ( 真的是非常的謝謝您們了囉! ~ ^^ )

     

    2006年12月4日 上午 08:20