我的程序是這樣工作的: 我按下一個單選按鈕,打開端口。
接下來我按下「讀取」按鈕,該按鈕啓動一個線程,該線程使用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事件而不是使用線程。 –