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
    }

因此,出于显而易见的原因,listen reader 需要在单独的线程上,但第二种方法必须从主线程完成,所以我使用一个事件,但如果您有其他想法。

谢谢

4

2 回答 2

2

Since you added the [picturebox] tag, we can assume this is Windows Forms (Winforms). The event handler for your reader thread will execute on the reader thread and you need to execute code (in response to the event) on the UI thread.

You can use your Form's BeginInvoke method to execute arbitrary code on the UI thread

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 回答