我的程序是这样工作的: 我按下一个单选按钮,打开端口。
接下来我按下“读取”按钮,该按钮启动一个线程,该线程使用port.ReadLine()
连续从串行端口读取数据并将其打印在文本框中;
我有另一个收音机,应该首先加入线程,然后关闭端口;问题是打印进展顺利,直到我关闭端口时,UI停滞。在Windows窗体应用程序中加入工作线程
public Form1()
{
mythread = new Thread(ReadFct);
myPort = new SerialPort("COM3", 9600);
myPort.ReadTimeout = 3500;
InitializeComponent();
foreach (var t in Constants.ComboParameters)
this.paramCombo.Items.Add(t);
radioClose.CheckedChanged += new EventHandler(radioButtonCheckedChanged);
radioOpen.CheckedChanged += new EventHandler(radioButtonCheckedChanged);
}
下面是连接到线
void ReadFct()
{
string aux = "";
while (readCondition)
{
if (myPort.IsOpen)
aux = myPort.ReadLine();
this.SetText(aux);
}
}
下面的功能是单选按钮的事件处理程序
public void radioButtonCheckedChanged(object sender,EventArgs e)
{
if (radioOpen.Checked && !myPort.IsOpen)
try
{
myPort.Open();
mythread.Start();
}
catch (Exception)
{
MessageBox.Show("Nu s-a putut deschide port-ul");
}
if (radioClose.Checked && myPort.IsOpen)
{
readCondition = false;
mythread.Join();
myPort.Close();
// myPort.DataReceived -= DataReceivedHandler;
}
}
读按钮功能:
private void readbtn_Click(object sender, EventArgs e)
{
if (!myPort.IsOpen)
MessageBox.Show("PORT NOT OPENED!");
else
{
// myPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
readCondition = true;
if (!mythread.IsAlive)
{
mythread = new Thread(ReadFct);
mythread.Start();
}
}
我有使用了MSDN的建议ST从另一个线程切换时控制:
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
StringTb del = new StringTb(SetText);
this.Invoke(del, new object[] { text });
}
else
SetData = text;
}
并且'SetText'方法是... –
它看起来像这样的代码每次您进行更改时都会生成2个radioButtonCheckedChanged事件。我认为你的代码处理了这个问题,但是...每个单选按钮都会生成一个true-> false和false-> true的事件,所以你点击一个按钮并且两个按钮都会创建相同的事件。我会将radioButtonCheckedChanged函数分成两部分(因为无论如何它都是2个独立的函数)。 – David
线程停留在ReadLine()调用中,因此永远不会看到请求停止运行。除非设备正在发送数据,否则有些可预测的情况不会发生。关闭()串口代替,这将炸毁ReadLine()调用,捕获异常。或者赞成DataReceived事件而不是使用线程。 –