2

ユーザーが入力した値に基づいて特定のサイクル数(1〜576)をループするWhileループを使用しています。ユーザーが「スタート」ボタンをクリックするとアクティブになりますが、できれば「Escキー」を使用してキャンセルできるようにしたいと思います。

ただし、ループが発生しているときは、プログラムにキーが押されたことを認識させることができません。

Private Sub OnGlobalKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles kh.KeyDown

        lblInput.Text = String.Format("'{0}' Code:{1}", e.KeyCode, CInt(e.KeyCode).ToString())


        If e.KeyCode = CType(27, Keys) Then
                    count = 0
                    loops = 0
        End If
    End Sub

マイループ

Private Sub RUNLOOP()
            While loops >= 1
                  ' my code that runs in the loop
                  loop = loop - 1
            End While
End Sub

ループの実行中は、キーを押しても登録されません。それ以外の場合は、正常に登録されます。

4

4 に答える 4

5

BackgroundWorkerバックグラウンドスレッドでwhileループコードを実行するために使用することを考えましたか?GUIが応答し続けることを確認しますApplication.DoEvents(=フォームのサイズ変更/再描画と、実行中の作業のキャンセルを実装した方法にユーザーが「到達」できるようにします)この振る舞いを「偽造」するループ?

すでに.NETFramework4.0を使用している場合は、の代わりに並列プログラミングBackgroundWorkerを試して使用することができます。

于 2009-08-17T08:47:44.610 に答える
2

これには 2 つの方法があります。ループに別のスレッドを使用するか、Application.DoEvents() を使用できます。一般に、スレッド アプローチが最良の結果をもたらします。

スレッド:

StopLoop() を呼び出すだけで、ループの実行を停止するように指示できます。loop = 0 を設定したくないのは、Interlocked クラスを使用してスレッド間でループが適切に設定されていることを確認する必要があるためです。

Private Sub RunLoop()
  Dim loop As Action = AddressOf InternalRunLoop
  loop.BeginInvoke(null, null)
End Sub

Private bStopLoop As Boolean

Private Sub InternalRunLoop()
  While loops >= 1 And Not bStopLoop
    ' my code that runs in the loop
    loop = loop - 1
  End While
End Sub

Private Sub StopLoop()
  bStopLoop = True
End Sub

DoEvents:

Application.DoEvents() を呼び出すと、ウィンドウのスレッドで保留中のすべてのイベントが処理されます。ループの各反復に時間がかかる場合でも、ユーザーにはアプリが応答していないように見えます。そのため、スレッド化されたアプローチが推奨されます。

Private SubRunLoop()
  While loops >= 1 And Not bStopLoop
    ' my code that runs in the loop
    loop = loop - 1
    Application.DoEvents()
  End While
End Sub
于 2009-08-17T09:02:37.607 に答える
-1

ループ内に次のコードを配置します。

Application.DoEvents()
于 2009-08-17T08:26:43.780 に答える
-3
While counter <= 10
         ' skip remaining code in loop only if counter = 7
         If counter = 7 Then
            Exit While
         End If

         counter += 1
      End While
于 2009-08-17T08:35:26.773 に答える