引入多线程后进行串行通信后出现蓝屏错误

时间:2013-09-19 18:35:34

标签: c# multithreading error-handling out-of-memory

我开发了一个应用程序,我在5秒后每隔一段时间轮询一次串口(发送请求并获得响应)。一切都很好,我彻底测试了。

但是当我介绍线程时,我得到关于物理内存的蓝屏错误或下面在线程中附加的东西我只是分开GUI更新任务和轮询任务。

任何人都可以建议我应该怎么做才能删除它,只是卡住而不理解该怎么做。

每次运行应用程序时都会发生这种情况,我正在使用熟练的驱动程序串行到usb驱动程序。

主要申请代码

private void timer_Elapsed(object sender, ElapsedEventArgs e)
 {
PollingAllMeters();         
 }


 public void PollingAllMeters()
    {
        int isdbError = 0;
        PollingUtility.MeterClass mData = new PollingUtility.MeterClass();



        for (int index = 0; index < m_slaveID.Length; index++)
        {
            try
            {
                mData = poll.MeterOne(m_slaveID[index]);
                Thread processData = new Thread(() => this.updateData(data));
                processData.Start();
            }
            catch { MessageBox.Show("Inside polling box"); 
         }
      }


    private void updateData(MeterValues data)
    {

        mainFormRef.updateData(data);

    }

实际请求和响应发生的DLL代码

enter code here
public MeterClass MeterOne(byte meterID)
    {
        MeterClass data1 = new MeterClass();
                 //Voltage
        mb.SendFc3(meterID, startAdd, register, ref value_meter); //modbus call is made here for         sending and receiving response at serial port
        if (mb.modbusStatus == "Read successful")
        { 
             //do some calculation
        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }


        startAdd = 360;
        register = 2;

        value_meter = new byte[register * 2];
        meterData = new byte[register * 2];

        //Max demand
        mb.SendFc3(meterID, startAdd, register, ref value_meter);
        if (mb.modbusStatus == "Read successful")
        {
            //do some calculation

        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }


        startAdd = 496;
        register = 16;

        value_meter = new byte[register * 2];
        meterData = new byte[register * 2];

        mb.SendFc3(meterID, startAdd, register, ref value_meter);
        if (mb.modbusStatus == "Read successful")
        {
          //do some calcualtion

        }
        else
        {
            // error handling code to create log file

            if (mb.modbusStatus == "Error in read event")
            {
                isPollError = 21;
            }
            else if (mb.modbusStatus == "CRC error")
            {
                isPollError = 22;
            }
            else if (mb.modbusStatus == "Serial port not open")
            {
                isPollError = 23;
            }
        }

        data1.date = DateTime.Now;
        data1.Status = isPollError;
        return data1;      // return result to the main program

    }

1 个答案:

答案 0 :(得分:2)

模拟串行端口的USB和BlueTooth设备驱动程序众所周知是不可靠的。我猜,这是一项苛刻的业务,不会花很多钱给一个优秀的程序员支付合适的工资。如果你无法获得驱动程序更新,你唯一能做的就是破坏这个东西,这样就不会让你的生活变得悲惨。把它带到停车场并用你的车跑几次。

在启动引擎之前,请仔细查看代码。 “多线程”是一个红色标记,驱动程序无视您使用多个线程的程序。避免出现可以从多个线程同时调用“读取”或“写入”的情况。驱动程序应始终具有弹性,但这不会经常受到测试。必要时重新调整代码,以便只有一个线程可以读取或写入或使用 lock 语句。