我创建了一个winform程序,用于从串口读取数据并将其显示在文本框中。数据将每隔5秒从外部设备发送一次。第一个数据是“1后跟”2“然后是”3“并永远重复相同的模式 当数据“1”,“2”和“3”分别收到时,我将使pictureBox1,pictureBox2,pictureBox3可见并播放gif。问题是有时候即使下一个数据到达,pictureBox也不会切换到下一个相应的。我不确定我是否正确使用了调用函数?
public Form1()
{
InitializeComponent();
SerialPortProgram();
pictureBox1.Image=
Image.FromFile(@"C:\Users\user\Downloads\Gif#1.gif");
pictureBox2.Image =
Image.FromFile(@"C:\Users\user\Downloads\Gif#2.gif");
pictureBox3.Image =
Image.FromFile(@"C:\Users\user\Downloads\Gif#3.gif");
}
// Create the serial port with basic settings
private SerialPort port = new SerialPort("COM17", 9600, Parity.None, 8, StopBits.One);
private void SerialPortProgram()
{
// Attach a method to be called when there
// is data waiting in the port's buffer
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
// Begin communications
port.Open();
// Enter an application loop to keep this thread alive
// Application.Run(); // if this Application.Run() is not commented out, Form1 will not be displayed
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Show all the incoming data in the port's buffer
string data = (port.ReadExisting());
Log(data);
if (data == "1")
{
gif1Showl();
}
if (data == "2")
{
gif2Show();
}
if (data == "3")
{
gif3Show();
}
}
private void Log(string msg)
{
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText(msg);
}));
}
private void gif1Showl()
{
this.Invoke(new ThreadStart(() =>
{
pictureBox1.Visible = true;
pictureBox1.Enabled = true;
pictureBox2.Visible = false;
pictureBox2.Enabled = false;
pictureBox3.Visible = false;
pictureBox3.Enabled = false;
}));
}
private void gif2Show()
{
this.Invoke(new ThreadStart(() =>
{
pictureBox1.Visible = false;
pictureBox1.Enabled = false;
pictureBox2.Visible = true;
pictureBox2.Enabled = true;
pictureBox3.Visible = false;
pictureBox3.Enabled = false;
}));
}
private void gif3Show()
{
this.Invoke(new ThreadStart(() =>
{
pictureBox1.Visible = false;
pictureBox1.Enabled = false;
pictureBox2.Visible = false;
pictureBox2.Enabled = false;
pictureBox3.Visible = true;
pictureBox3.Enabled = true;
}));
}
答案 0 :(得分:0)
您应该检查是否需要调用并致电您的代理人。创建一个新线程来更新UI本身是错误的。
MethodInvoker methodInvokerDelegate = delegate()
{
pictureBox1.Visible = false;
pictureBox1.Enabled = false;
pictureBox2.Visible = false;
pictureBox2.Enabled = false;
pictureBox3.Visible = true;
pictureBox3.Enabled = true;
};
//This will be true if Current thread is not UI thread.
if (this.InvokeRequired)
this.Invoke(methodInvokerDelegate);
else
methodInvokerDelegate();