多线程与Queue列队使用出了点问题
环境:VS2010 C# win窗体程序
代码:
一些定义:
bool 真 = true, 假 = false;
Thread 数据处理线程;
private SerialPort 串口 = new SerialPort();//串口对象
Queue<byte[]> 串口缓冲区 = new Queue<byte[]>();
首先是一个串口接收数据的处理函数:
private void 串口中断(object sender, SerialDataReceivedEventArgs e)
{
int 数据量 = 串口.BytesToRead;//检测有多少数据可读
byte[] buffer = new byte[数据量];
for (int 循环变量 = 0; 循环变量 < 数据量; 循环变量++)
{
buffer[循环变量] = (byte)串口.ReadByte();
}
串口缓冲区.Enqueue(buffer);//把数据写入列表
}
窗体加载函数,创建了一个数据处理的线程:
private void 窗体加载(object sender, EventArgs e)
{
变量初始化();
串口.DataReceived += 串口中断;//绑定串口函数
串口.BaudRate = 115200;
串口.Open();//打开串口
数据处理线程 = new Thread(new ThreadStart(数据处理));//绑定线程对应的函数
数据处理线程.Start();//开启线程
}
数据处理的函数:
private void 数据处理()
{
while (真)
{
if (串口缓冲区.Count > 0)
{
MessageBox.Show("xxx");
...//此处为问题所在,省略其他代码
}
}
}
背景:
串口会接收很多数据,数量不确定是多少,但至少能让“串口中断”函数执行个几十次。
程序目的:
让串口接收的数据写入列表,另一个线程取出后使用,并打印到richtextbox
现象:
if (串口缓冲区.Count > 0)
MessageBox.Show("xxx");
此处只进来了3次
问题:
为何会只进来3次,因为串口中断函数会执行很多次的。从richtextbox的显示来看,显示的并不完全,可以保证的是,串口接收数据是没有问题的(用单线程直接写入richtextbox试过),所以问题应该出在线程使用或者列表使用出了问题。
忘路过的大神帮忙解答下小弟遇到的问题。感谢!
------解决方案--------------------在串口中断里会读取串口缓冲区的数据,读取完后,如果没有数据接收到,那缓冲区的Count就是0了
这里使用的多线程,在判断if(串口缓冲区.Count>0)时,串口接收中断又同时在读取串口,一旦串口的数据都读取完毕了,那缓冲区的字节数就为0了。另外,MessageBox.Show()没有及时关闭,也会影响进入的次数,因为显示MessageBox的时候,串口接收中断事件一直在读取串口,因此,串口接收事件触发的次数与进入
if(串口缓冲区.Count>0)的次数是不一样的