C#开发上位机监听器程序闪退现象

qq_39033657 WEB前端  2017-11-16 11:58:34
在监听数据的时候,读取串口接收的数据进行解析,解析出来的数据实时在文本框中显示,接收的数据量很多也很快,程序工作时间长了会出现闪退现象,这是怎么回事?
...全文
307 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qq_39033657 2017-11-25
谢谢各位的回复
  • 打赏
  • 举报
回复
Antony_WU_SZ 2017-11-20
串口过时了,个人经验,搞成网口吧,走TCP通讯就没有这么多问题了。
  • 打赏
  • 举报
回复
圣殿骑士18 2017-11-18
关键代码并不完整。比如,刷新的机制是什么?读取的数据是通过什么逻辑显示到界面上的? 而且跨线程逻辑很啰嗦,感觉应该没实现跨线程的机制,所谓BeginInvoke没有真正起作用。 跨UI线程很简单,不需要定时刷新,不需要DoEvents。BeginInvoke足够。
/// <summary>
        /// 读取线程
        /// </summary>
        /// <param name="list"></param>
        void reader_TagsReport(List<TagInfo> list)
        {
            if (list.Count == 0) return;

            bool tagNew = false;
            DateTime? newReadTime = null;
            list.ForEach((x) =>
            {
                var tag = listTag.Find(c => c.Epc == x.Epc);
                if (tag == null)
                {
                    var tagnew = new TagInfo()
                    {
                        Epc = x.Epc,
                        ReadCount = 1,
                        ReadTime = DateTime.Now,
                        ReaderId = x.ReaderId,
                        AntennaId = x.AntennaId
                    };
                    lock (listTag)
                    {
                        listTag.Add(tagnew);
                        newReadTime = DateTime.Now;
                        tagNew = true;
                    }
                }
                else
                {
                    lock (listTag)
                    {
                        tag.ReadCount++;
                        tag.ReadTime = DateTime.Now;
                        tag.ReaderId = x.ReaderId;
                        tag.AntennaId = x.AntennaId;
                    }
                }
            });

            //刷新UI
            if (tagNew) //读取到新标签
            {
                this.BeginInvoke(new Action<bool, DateTime?>(BindData), true, newReadTime);
            }
            else //旧标签的重复读取
            {
                //进行时间间隔控制:如果刷新频率太高,即使跨线程调用也会把UI线程卡死的
                DateTime dtNow = DateTime.Now;
                if (lastRead == null || (dtNow - lastRead).TotalMilliseconds > 100)
                {
                    this.BeginInvoke(new Action<bool, DateTime?>(BindData), false, null);
                    lastRead = dtNow;
                }
            }
        }

        /// <summary>
        /// UI线程刷新
        /// </summary>
        /// <param name="readTime"></param>
        /// <param name="isNew"></param>
        private void BindData(bool isNew, DateTime? readTime)
        {
            var bindingList = this.gridEpcs.DataSource as BindingList<TagInfo>;
            bindingList.ResetBindings();

            if (isNew) lbCount.Text = listTag.Count.ToString();
            if (readTime.HasValue)
            {
                TimeSpan ts = readTime.Value - readStart;
                lbTimeCount.Text = ts.Seconds.ToString() + "s" + ts.Milliseconds.ToString();
            }
        }
  • 打赏
  • 举报
回复
qq_39033657 2017-11-18
第一次开发上位机,自己还是个菜鸟,感谢各位大神的回复。 下面是串口接收函数和数据实时刷新的函数,望哪位大神指导,谢谢。

  int received_count;
        //接收的buffer
        byte[] serial_buf = new byte[10240000];
        bool is_rev = false;

        FrameParsor parsor;
        /// <summary>
        /// 传输数据逻辑修改,需要修改的地方为bytes转str的那一步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void mycom_DataReceived(object sender, EventArgs e)  //接收串口数据并分析
        {
            if (closing)
                return;
            try
            {
                is_rev = true;
                int n = mycom.BytesToRead;
               
                if (n < 1)
                {
                    //***接收完成状态指示。
                    is_rev = false;
                    return;
                }
                //读数据,
               if( n > 10240000)
                {
                    n = 10240000;
                }

                byte[] data = new byte[n];
              
                mycom.Read(serial_buf, 0, n);
                //使用FrameParsor转换数据格式
               
                Array.Copy(serial_buf, 0, data, 0 ,n);
                parsor.AddFrame(data);
                Thread.Sleep(10);
            }
            catch (Exception ex)
            {
               //
 Log.WriteLog(ex);
                throw ex;
            }
            finally
            {
                is_rev = false;
            }

        }

        /// <summary>
        /// 定时刷新com_txt组件
        /// </summary>
        /// <param name="obj"></param>
        //
        void flushComTxt(object obj)
        {
            if(com_txt_add.Length() <= 0)
            {
                return;
            }
            com_txt.BeginInvoke(new EventHandler(delegate
            {
                //***正在处理字符串。
                DoingStr = true;
                if (true == checkBox1.Checked)
                {
                    if (com_txt.Text.Length > 131072)
                    {
                        com_txt.Text = string.Empty;
                    }

                    com_txt.AppendText(com_txt_add.Empty());
                    com_txt_add.Empty();
                    //将控件的内容滚动到当前位置。
                    com_txt.ScrollToCaret();
                }
                //***完成处理字符串。
                DoingStr = false;
            }
                ));
            while (DoingStr)
            {
                //处理其它系统消息。
                Application.DoEvents();


            }
        }
  • 打赏
  • 举报
回复
sdfgrtyu 2017-11-16
上代码啊上代码
  • 打赏
  • 举报
回复
圣殿骑士18 2017-11-16
看内存有没有释放?如果内存使用一直增加没有释放,程序迟早要崩溃。
  • 打赏
  • 举报
回复
xian_wwq 2017-11-16
闪退是表象,原因靠猜是不行的 先捕获下异常吧

   Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
   AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  • 打赏
  • 举报
回复
相关推荐
军队作战SLG小游戏策划案+公式设计+JSON实例模拟打包 公元135年,相传高祖病重后继无人,宦官专权祸乱朝纲,同年群雄逐鹿风起云涌。乱世的暗流涌动,引起了不少英雄豪杰的注意。在广袤的疆域上,战马赫赫战鼓阵阵,纷飞的战火中,是敌人还是朋友也逐渐清晰了起来,这一战不止为了义气还为了和平。 在你身边的有从军队中一路砍杀过来的勇士,也有行侠仗义的游侠,也有代父从军的女子,也有从小被培养的刺客。他们组成了一支军队,运用自己擅长的作战方式,听从你的指挥,一切性命都系在你的身上,如何判断作战情况都在你的一念之间。当然军师会协助你,招兵买马,扩充军队,上阵步兵,作战方式均可与其商讨,谋而后立裁决果断并不冲突。 当然战场上武器一定是需要配备的,作战中失去了武器就等同于失去了性命,如何为军队中所有人配置趁手的武器也是作为主帅的你需要考虑的事情。训练军队的同时也要建设城镇,满满的谷仓,成群的鸡鸭,后方有稳健的保障,前方作战才能更加的果敢。 乱世出英雄,在各种战役中飞快成长,创建一番属于自己的天地吧 实例对比描述: 实例说明: 实例展示了不同情况的军队作战效果,只需要调整参数既可以达到差异化目的。 第一组实例:1000军队的骑兵对战1000军队的骑兵,先手攻击方的
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-16 11:58
社区公告

让您成为最强悍的C#开发者