+ -
当前位置:首页 → 问答吧 → C# 线程问题

C# 线程问题

时间:2011-12-17

来源:互联网

我做了一个简单的串口接收程序,程序是这样的,启动时打开串口,创建了一个接收线程,一直循环接收数据。界面上有关于串口的一些配置,比如串口号。当程序运行起了之后正常接收数据了,改变串口号,也就是改变了serialPort的name属性后,线程出现异常。其实我也知道是因为线程中一直是使用的serialPort在接收数据,但是界面线程中改变了serialPort的属性出现的异常,可是不这样的话该如何处理呢,对于C#中的多线程处理还不是很清楚,望各位大虾指教

初始化加载窗口时创建启动线程:
  private void MainForm_Load(object sender, EventArgs e)
  {
  threadconn = new Thread(serialRecv);
  threadconn.IsBackground = true;
  threadconn.Start();
  
  }

接收线程程序:

private void serialRecv()
{
  byte[] recvbuf = new byte[1024];
  int recvlen = 0;

  while (serialPort.IsOpen)
  {
  Thread.Sleep(10);
  
  recvlen = serialPort.Read(recvbuf, 0, recvbuf.Length);//serialPort是串口控件
  }
  DispalyData(recvbuf);
}

界面线程中改变串口号的配置:
  private void comboSerialPort_SelectedIndexChanged(object sender, EventArgs e)
  {
  if (serialPort.IsOpen == true)
  {
  serialPort.Close();
  }

  serialPort.PortName = comboSerialPort.Text;

  serialPort.Open();
  }

作者: blwuer   发布时间: 2011-12-17

作者: hefeng_aspnet   发布时间: 2011-12-18

你这个似乎是逻辑问题,不是语言问题了
程序:UI线程,接受线程
UI线程会改变接受线程接受的对象

那么你可以这么做:
1.UI线程和接受线程消息通信
2.你的接受线程要可控,可停止,可启动
3.你改变串口设置的时候,应该是这样的:停止接受,修改设置,启动接受

那么主要问题就是c#线程怎么相应消息了:
这个你看看PostThreadMessage函数,GetMessage函数
可以看看这个:http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2007126/90800.html
你自己定义消息就好了

作者: shyandsy   发布时间: 2011-12-18