none
[VB2003] sleep 和 for ... next 配合畫面 button 無法觸發 clicked event。 RRS feed

  • 問題

  • 各位先進,大家好

     

    編譯器或直譯器:VB2003 ( .Net FrameWork 1.1 )

    編譯器語系:繁中

    開發作業系統:Windows XP SP3 (繁中)

    執行作業系統:Windows Mobile 6.1 Classic

     

    我的問題:

    小弟在一個 Form 上有 2 個 Button , 一個叫 「開始」 一個叫 「停止」

    「停止」的 Button 上有一個全域變數 gp_stop 為 boolean 的形態,若被觸發 Clicked 事件的話 gp_stop 會被設定為 True

    「開始」的 Button 上有一個 For Next 的迴圈 (如下)

    Dim i as integer
    
    For i = 0 to 1000
    
    	Thread.Sleep(0)
    
    	if gp_stop then
    		Exit For
    	end if
    
        '未按停止時會續繼往下做
    
    next
    

    小弟實作後,For 迴圈會執行,但是「停止」的按鍵,去按它卻無反應

    小弟有嘗試用 Timer 做過,不過整體執行的速度卻會變慢

    小弟在 MSDN Library 上有找到一個 Thread.Yield() 可惜的是只能用在 .Net FrameWork 4.0

     

    不知那位先進可以幫我解惑

     

    謝謝。

    2010年10月19日 上午 09:29

解答

  • 我太笨了, 居然沒想到這件事

    你Sleep多久都沒用的, 因為你寫在UI執行緒中, 等於暫停了整個UI執行緒, 訊息迴圈也不會有反應

    迴圈要在另一個執行緒才對,類似以下:

    Dim gp_stop As Boolean = False
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim myThread As New Threading.Thread(AddressOf exitsub)
            myThread.Start()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            gp_stop = True
        End Sub
        Private Sub exitsub(ByVal Obj As Object)
            gp_stop = False
            Dim i As Double
            For i = 0 To 1000000000000
                If gp_stop Then
                    MessageBox.Show(i.ToString())
                    Exit For

                End If
                '未按停止時會續繼往下做
            Next
        End Sub

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Robin Chen 2010年10月21日 上午 05:44
    2010年10月20日 下午 01:09
    版主

所有回覆

  • 可能訊息迴圈根本來不及反應你的Button Click.

    先把Thread.Sleep的值改大一點, ex: 10 , 然後再慢慢往下調整看看


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年10月19日 上午 11:38
    版主
  • 感謝 Bill 的回覆, Sleep 的值我有測過從 0 , 50 , 100 , 300 , 500 , 1000 ,可惜結果都一樣

    目前小弟正在用 Thread 的方法,看可不可以解決這個問題

    2010年10月20日 上午 02:39
  • 您可以用BackgroundWorker來執行迴圈, 再利用BackgroundWorker類別的CancelAsync方法來結束迴圈
    2010年10月20日 上午 09:18
  • 我太笨了, 居然沒想到這件事

    你Sleep多久都沒用的, 因為你寫在UI執行緒中, 等於暫停了整個UI執行緒, 訊息迴圈也不會有反應

    迴圈要在另一個執行緒才對,類似以下:

    Dim gp_stop As Boolean = False
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim myThread As New Threading.Thread(AddressOf exitsub)
            myThread.Start()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            gp_stop = True
        End Sub
        Private Sub exitsub(ByVal Obj As Object)
            gp_stop = False
            Dim i As Double
            For i = 0 To 1000000000000
                If gp_stop Then
                    MessageBox.Show(i.ToString())
                    Exit For

                End If
                '未按停止時會續繼往下做
            Next
        End Sub

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 Robin Chen 2010年10月21日 上午 05:44
    2010年10月20日 下午 01:09
    版主
  • 再次感謝 Bill 大大

    我已用您的方式解決問題了

    感謝大大。

    2010年10月21日 上午 05:46