[英]C# Serial DataReceived Event Invoke Function Not Working Properly
我制作了一個winform程序來從串行端口讀取數據並將其顯示在文本框中。 每隔5秒從外部設備發送一次數據。 第一個數據是“ 1,然后是” 2”,然后是“ 3”,並永遠重復相同的模式。
我將使pictureBox1,pictureBox2,pictureBox3可見,並在分別接收到數據“ 1”,“ 2”和“ 3”時播放gif。 問題是,有時即使下一個數據到達,pictureBox也不會切換到下一個相應的圖像。 我不確定我是否正確使用了invoke函數?
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;
}));
}
您應該檢查是否需要調用並致電您的代表。 創建新線程來更新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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.