2012-01-18 17 views
0

私はインターネット接続をテストするために使用している関数をループするためにDOインターアクションを使用しています。コードが正常に動作していますが、テストの1つが満たされるとループが停止します。私はプログラムが実行されている間、これをバックグラウンドで継続したい。これをどのように機能させることができますか?繰り返しが意図したとおりに動作しない

Private Sub checkInternet() 

    Dim InetChecker As Boolean 
    InetChecker = CheckForInternetConnection() 
    Do While LabelCount.Text <> "" 
     Thread.Sleep(10) 
     If InetChecker = True Then 
      Dim image = My.Resources.greenbar 
      PictureBox4.Image = image 

     Else 
      Thread.Sleep(10) 
      Dim image = My.Resources.redbar 
      PictureBox4.Image = image 
      'NoInetConnError.Show() 
     End If 
    Loop 
End Sub 

ご協力いただき誠にありがとうございます。

答えて

2

フォーム上のBackgroundWorkerを入れて(ツールボックスのコンポーネントセクションでそれを見つけるでしょう):あなたの状況については、MSDNの例を変更

、あなたはこのような何かを行うことができます。

[プロパティ]ウィンドウで、BackgroundWorkerにWorkerReportsProgressTrueを設定します。

Sub BackgroundWorker1_DoWork別のスレッドで実行され、それが実行されている間、あなたのフォームを凍結しないことを、あなたのフォーム

Private connected As Boolean 

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) _ 
Handles BackgroundWorker1.DoWork 
    While True 
     Dim online = CheckForInternetConnection() 
     If online <> connected Then 
      connected = online 
      BackgroundWorker1.ReportProgress(CInt(online)) 
     End If 
     Thread.Sleep(500) 
    End While 
End Sub 

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) _ 
Handles BackgroundWorker1.ProgressChanged 
    Dim online As Boolean = CBool(e.ProgressPercentage) 
    If online Then 
     PictureBox4.Image = My.Resources.greenbar 
    Else 
     PictureBox4.Image = My.Resources.redbar 
    End If 
End Sub 

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles MyBase.Load 
    ' Start the background worker 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

ノートに以下のコードを挿入します。

+0

うわー、これは魅力的だった。ありがとう。 –

1

Timerでこのようなことを行うのが最善でしょう。

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick 
    If CheckForInternetConnection Then 
    PictureBox4.Image = My.Resources.greenbar 
    Else 
    PictureBox4.Image = My.Resources.redbar 
    End If 
End Sub 
+0

ご意見ありがとうございます。しかし、コードが実行されるたびにアプリケーションが応答しなくなる原因となっていました。ですから、以下の@davidsleepsで提案されているバックグラウンドワークメソッドを使用できるかどうかを確認します。再度、感謝します。 –

+0

@KismetAgbasiコードをあまりにも頻繁に呼び出さないようにしてください。投稿されたコードでは、チェックの間に10ミリ秒間寝ていました。おそらくあなたのCheckFor ...メソッドをあまりにも頻繁に実行しています。エンドユーザーにステータスを表示しようとしているだけなので、10-30秒はより現実的かもしれません。私はあなたの他の質問からあなたのCheckForInternetConnectionコードを見ました:あなたは10ミリ秒ごとにそのコードを実行する場合は、あなたが彼らに何をしているかGoogle(または任意のウェブサイト)は感謝しないかもしれません。 – LarsTech

+0

ありがとう、私はそれについて考えなかった。待ち時間/睡眠時間を調整します。 –

0

あなたは、.NET Framework 3+へのアクセス権を持っているなら、あなたは基本的にあなたがTickイベントを処理することができます(必要なものは何でも長さに設定)の間隔を作成するDispatcherTimerクラスを使用することができます。 tickイベントが発生すると、インターネット接続チェックを行うことができます。

' DispatcherTimer setup 
dispatcherTimer = New Threading.DispatcherTimer() 
AddHandler dispatcherTimer.Tick, AddressOf dispatcherTimer_Tick 
dispatcherTimer.Interval = New TimeSpan(0,0,1) ' Or however long you want 
dispatcherTimer.Start() 

Private Sub dispatcherTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) 
    ' Checks to see whether an internet connection is still available etc 
    checkInternet() 

    ' Forcing the CommandManager to raise the RequerySuggested event 
    CommandManager.InvalidateRequerySuggested() 
End Sub 
+0

ご迷惑をおかけして申し訳ありませんが、dispatcherTimerコントロールはツールボックスで使用できません。 –

関連する問題