2014-12-13 146 views
0

我有以下代碼(VB.Net)正在做我想要的東西(即暫停在特定的時間間隔/位置的代碼和恢復時,單擊Messagebox按鈕)... .... 唯一的問題是,我用了一個messagebox;有沒有一種方法可以使用按鈕來完成相同的工作;沒有計時器,沒有消息框?VB.Net暫停和恢復對下一個

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim Index As Integer 
    For KKK = 1 To 50 
     Index = KKK/5 
     If Index = KKK/5 Then 
      MessageBox.Show("Paused at: " & KKK & " : Click OK to Resume") 
     End If 
    Next 
End Sub 

在此先感謝您的意見和幫助。

回答

0

如果升級到VS2013共同體(這是免費的),那麼你可以使用異步/等待組合是這樣的:

Public Class Form1 

    Private MRE As New Threading.ManualResetEvent(False) 

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Button1.Enabled = False 
     Button2.Enabled = False 

     For KKK = 1 To 50 
      If KKK Mod 5 = 0 Then 
       Label1.Text = KKK 
       MRE.Reset() 
       Button2.Enabled = True 
       Await WaitForButton() 
      End If 
     Next 

     Button1.Enabled = True 
    End Sub 

    Private Function WaitForButton() As Task 
     Return Task.Run(Sub() 
          MRE.WaitOne() 
         End Sub) 
    End Function 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Button2.Enabled = False 
     MRE.Set() 
    End Sub 

End Class 
+0

我必須承認你的解決方案非常有效。在Visual Studio 2012 Ultimate中進行測試。 – SkyMaster 2014-12-13 19:59:03

+0

VS2012首次引入了異步/等待,因此這將是您可以使用的最早的版本。 – 2014-12-13 20:21:01

+0

謝謝Idle_Mind;我正在嘗試幾天來做這個更新;我會解決它...非常感謝您的意見和答覆;我之前用過其他成員的答案,他們非常有用......我承認你......乾杯。 – Abbas1999 2014-12-18 00:25:13

-1

您可以通過將循環放入單獨的線程,休眠以及按下按鈕中斷來完成此操作。在這個例子中,button1啓動循環,而button2在thread.sleep處中斷它。

Dim newThread As New Thread(AddressOf loopSub) 
Delegate Sub textAddCallback(ByVal s As string) 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
newThread.Start() 
End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
newThread.Interrupt() 
End Sub 

Sub loopSub() 
    Dim Index As Integer 
    Dim textDelegate As New textAddCallback(AddressOf textAdd) 

    Try 
     For KKK As Integer = 1 To 50 
      Index = KKK/5 
      If Index = KKK/5 Then 
       Thread.Sleep(36000) ' sleep the max amount of milliseconds 
      End If 
     Next 
    Catch ex As ThreadInterruptedException 
     Me.Invoke(textDelegate, "string to add") 
    End Try 

End Sub 

Sub textAdd(ByVal s As String) 
rtext1.text &= s 
End Sub 
+0

喜xpda;非常感謝...我試圖測試你的代碼,但它不允許我在Sub loopSub()中的RichTextBox中添加AppendText,因爲它位於單獨的線程中...... ...我在裏面使用了RichTextBox最初的For-Next Loop ......有沒有辦法做到這一點? – Abbas1999 2014-12-13 03:21:03

+0

是的,這有點麻煩,但你可以使用調用委託。我會添加(未經測試,但你會明白)答案。 – xpda 2014-12-13 03:26:36

+0

感謝xpda的努力,我仍然遇到代碼問題;我想知道messagebox如何完成這項工作? – Abbas1999 2014-12-13 03:51:09

0

2個按鈕和一個標籤是必需的。試試這個:

Dim Pause As Boolean  

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Dim Index As Integer 
    Pause = False 
    Button2.Text = "Ok" 
    Button2.Enabled = False 
    For KKK = 1 To 50 
     System.Threading.Thread.Sleep(250) 'Just for testing purposes, do not use this instruction. 
     Index = KKK/5 
     If Index = KKK/5 Then 
      Label1.Text = "Paused at: " & KKK & " : Click OK to Resume" 
      Pause = True 
      Button2.Enabled = True 
      Button2.Focus() 
      While Pause 
       Application.DoEvents() 
      End While 
      Label1.Text = "" 
      Button2.Enabled = False 
     End If 
    Next 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    Pause = False 
End Sub 
+0

這應該可行,但我認爲CPU的負載可能會在While循環中激增。 – xpda 2014-12-13 03:31:52

+0

嗨SkyMaster;我正在嘗試代碼,但似乎沒有做這項工作?我仍然試圖讓它工作,但我明白了你的想法;我同意你關於CPU的問題;你有一個想法如何在不影響CPU的情況下完成這項工作? – Abbas1999 2014-12-13 03:35:38

+0

CPU的問題很小。 DoEvents()方法處理消息隊列中的所有消息。 – SkyMaster 2014-12-13 04:00:50