Esempio n. 1
0
        private void ReadCanBusThread()
        {
            byte[] Msg;


            TBaseModule Module;
            uint        ID = 0;
            string      Loginfo;


            while (!cancelTokenSource2.IsCancellationRequested)
            {
                Thread.Sleep(1);

                //从总线上读取数据,需要并发处理
                if (_CanObj.ReadCanMsg(ref ID, out Msg))
                {
                    //Todo 使用异步委托执行,在新的线程中执行
                    //但线程不停的创建并释放耗时
                    //思考:如果把数据处理部分放到线程池中处理,效率是否能够提升?

                    lock (lockHelper)
                    {
                        _ModuleList.TryGetValue(ID, out Module);

                        if (Module != null)
                        {
                            //如果其它线程也在操作该模块对象,如读取该模块的属性值,而本线程正在执行DoMsg,
                            //该如何同步该模块?
                            //这是个虚方法,如果被子类覆盖则调用子类的实现
                            //这个方法中不能有同步到主线程处理的动作,不然会阻塞CAN总线的读写

                            Module.DoMsg(Msg);

                            //Module.AddMsgToQueue(ID, Msg); //数据压入每个模块自己的处理队列中
#if DEBUG
                            Loginfo = "Rece:" + GetInfoMsg(ID, Msg);
                            LogHelper.WriteLog(Loginfo);
#endif
                        }
                    }
                }
            }
        }