我想做一件简单的事。
我有一个辅助线程听取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
}
因此,听读者需要在单独的线程中出于显而易见的原因,但第二种方法必须从主线程完成,所以我使用一个事件,但如果你有另一个想法。
由于
答案 0 :(得分:2)
由于你添加了[picturebox]标签,我们可以假设这是Windows Forms(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);
}
答案 1 :(得分:0)
计数器方法可以检查当前线程是否可以更新图片框,如果没有,它可以将执行传递给可能是这样的线程:
private void Counter()
{
if (pictureBox.InvokeRequired)
{
Action action = Counter;
pictureBox.Invoke(action);
return;
}
pictureBox.Image = Resources._5;
}
我还建议您使用Pascal案例作为您的方法名称 - 这是非常标准的。 Capitalization Conventions