以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]串口的DataReceived事件造成窗体卡死  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=126391)

--  作者:noway143
--  发布时间:2018/10/20 10:42:00
--  [求助]串口的DataReceived事件造成窗体卡死
我的串口有大量实时数据在接收,而数据发送端是一直保持发送,不会停的。
我在DataReceived收到数据后,直接在窗体控件上显示出来,我这样做其它问题都没有,只是用窗体上的button去close这个串口时,随机性的整个窗体被卡死,不报任何异常信息。

我百度后,似乎是由于DataReceived事件和窗体处于不同线程,需要使用invoke或begininvoke来跨线程使用窗体控件,请教这在foxtable中怎么实现?代码怎么写?

--  作者:有点蓝
--  发布时间:2018/10/20 11:14:00
--  
试试使用异步函数去关闭串口:http://www.foxtable.com/mobilehelp/scr/3269.htm
--  作者:noway143
--  发布时间:2018/10/22 10:20:00
--  
使用异步函数去关闭串口,还是不行,但可以出现报错信息窗口了。

图片点击可在新窗口打开查看此主题相关图片如下:捕获.jpg
图片点击可在新窗口打开查看


我的理解是:

异步函数去关闭串口,相当于又开了一个新线程去尝试关闭串口,这样做,虽然不会阻塞窗体UI所在的主线程,解决了主窗体被卡死的问题;

但此时,DataReceived事件所在的线程因为一直还在接受数据,串口资源一直被这个线程占用,且这个线程还一直在使用主线程的窗体控件(因为DataReceived收到的数据一直=使用textbox控件来显示),这时,用于关闭串口的新开线程直接关闭掉串口,依然会发生异常。

使用异步函数去关闭串口,只是相当于把这个错误从主线程转移给了新开的子线程而已,但并没有消除这个错误。

--  作者:有点甜
--  发布时间:2018/10/22 10:53:00
--  

为什么要关闭串口?不关闭不可以?

 

做一个变量记录标记,如果标记成关闭,你DataReceived事件就不执行操作,即可。

 

在某个你不需要串口的时候,你再close即可。