0

簡単なことをしたいです。

USBリーダーをリッスンしているセカンダリスレッドがあります。リーダーが何かを「読み取る」と、スレッドはイベントを発生させます。そして、そのイベントはタイマーを開始しますが、タイマーは機能しません。スレッドに関するものであると確信しています。

また、タイマーはフォーム内の一部の画像を変更する必要があるため、これはメインスレッドで行う必要があります。

はっきりしているといいのですが。

private void listenReader()
    {
        while (whileState)
        {

                if (readsSomething)
                {
                    evt.OnSomeEvent();
                    break;
                }

        }
    }

    private void eventStartsThisMethot(){
        //do a lot of things and start the timer
        }

    private void counter(){
        pictureBox.Image = Resources._5;
    //the timer ticks this methot
    }

したがって、リッスンリーダーは明らかな理由で別のスレッドにある必要がありますが、2番目のメソッドはメインスレッドから実行する必要があるため、イベントを使用しますが、別のアイデアがある場合は。

ありがとう

4

2 に答える 2

2

[picturebox]タグを追加したので、これはWindowsフォーム(Winforms)であると見なすことができます。リーダースレッドのイベントハンドラーはリーダースレッドで実行されるため、UIスレッドで(イベントに応答して)コードを実行する必要があります。

フォームのBeginInvokeメソッドを使用して、UIスレッドで任意のコードを実行できます

private void ProcessMessageOnUIThread(YourMessageType msg)
{
    // Process here
}

private void ReaderThreadEventHandler(YourMessageType msg)
{
    // Invoke the UI thread to process the message
    BeginInvoke(new Action(ProcessMessageOnUIThread), msg);
}
于 2012-07-20T21:57:18.347 に答える
0

counterメソッドは、現在のスレッドが画像ボックスを更新できるかどうかを確認できます。更新できない場合は、次のようなスレッドに実行を渡すことができます。

private void Counter()
{
    if (pictureBox.InvokeRequired)
    {
        Action action = Counter;
        pictureBox.Invoke(action);
        return;
    }

    pictureBox.Image = Resources._5;
}

また、メソッド名にはPascalケースを使用することをお勧めします。これはかなり標準的な方法です。キャピタライゼーション規則

于 2012-07-20T22:47:25.277 に答える