3

まず最初に、Visual Basic 2010を使用しており、リモートクライアントからのネットワーク要求をチェックするために継続的にループするスレッドがあります。クライアントが特定のリクエストを送信すると、タイマーがトリガーされてフォームのカウントダウンが開始されますが、スレッドの実行中に何らかの理由でタイマーをまったく開始できません。また、タイマーを開始する前にスレッドを中止しようとしましたが、それも機能しません。私は先週からこれについて壁に頭をぶつけてきたので、どんな助けもいただければ幸いです。

Do While p1buzzedstatus = False Or p2buzzedstatus = False Or p3buzzedstatus = False
    'Download Communication File'
    Try
        Threading.Thread.Sleep(1)
        Dim Aclient As New Net.WebClient
        Aclient.Credentials = New Net.NetworkCredential(remote_buzzer_registration.FTPUserName, remote_buzzer_registration.FTPPassword)
        If Aclient.DownloadString(BuzzerCommandURL) = "" Then
            'Don't Do Anything'
        Else
            'Check For Buzz'
            keypressed = Aclient.DownloadString(BuzzerCommandURL)
            Aclient.UploadString(BuzzerCommandURL, "")
            buzzercode()
            answer_timer.Start()  ' <--- HERE
        End If
    Catch ex As Exception
    End Try
Loop
4

2 に答える 2

3

answer_timerが WinForm タイマー コントロール ( ) の場合System.Windows.Forms.Timer、UI スレッド以外のスレッドから開始することはできません。別のスレッドから WinForm タイマー コントロールを開始しても例外は発生しませんが、まったく機能しません。

タイマーを適切に開始するには、次のように UI スレッドでメソッドを呼び出します。

Me.Invoke(New MethodInvoker(AddressOf answer_timer.Start))

System.Timers.Timerまたは、またはを使用することもできますSystem.Threading.Timer。どちらもどのスレッドからでも正常に機能します。の 1 つSystem.Timersは、コントロールに最も近いものです。ただし、これらの他の 2 つのタイマーは新しいスレッドを介して動作するため、タイマーの動作時に実行されるコードは、UI に対して何かを行う前に、UI スレッドを呼び出す必要があります。そのため、タイマー ティック コードがフォームまたはコントロールに対して何かを実行している場合は、おそらく WinForm タイマー コントロールを使用する方が簡単です。

于 2013-01-07T14:56:23.223 に答える
1

推測では、あなたのタイマーは Windows フォーム上にあり、別のスレッドを使用してそれを更新しようとしていますか? これを試すと、イベントはトリガーされません (私の記憶が正しければ、動作は奇妙に見えます)。UI スレッドを 2 番目のスレッドで直接更新できないため、この問題が発生しています。2 番目のスレッドによって呼び出される UI スレッドでデリゲートを使用するようにしてください。

Timer.start をデリゲートにラップするだけです。キャッチは次のとおりです。タイマーがスレッド 2 で何かを行う場合、再び問題が発生します。そのため、タイマーをスレッド 2 (新しい windows.forms.timer としてタイマーを暗くする) に移動し、そこで実行するのが最善でしょう。tickイベントでは、デリゲートを発生させてカウントダウンを更新できます...

于 2013-01-07T14:18:56.687 に答える