日期:2014-05-17  浏览次数:20794 次

多线程与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)的次数是不一样的