代碼中增加文字log,寫到一個.txt
看看log停在哪裡
代码量很大哦。而且还是多线程,log会不会有点不易操作??
@😀明笔记:
除錯用而已,簡單分割標示程序進行到哪個階段
用完就拿掉
@RosonJ: 6个线程哦。有点难搞
@RosonJ: 而且是独立互不影响的,最终都作用于一个表格里
@😀明笔记:
對同一個表格作用,應該會有lock問題吧
@RosonJ: lock加了。如果不加或者少加了会怎样?
@😀明笔记:
總共6個線程,第一個線程加了鎖,其他五個就無法讀寫(讀也許可以),
換句話說,同一個瞬間,只能有一個線程在工作,另外五個只能等待
我認為這很有可能就是導致程序緩慢,看起來像卡死的原因
@RosonJ: 但是线程都停止工作了。软件等待了很久还是没有反应哦。按道理来说,应该是卡死一段时间就处理完了把?
@😀明笔记:
如何確定線程工作都處理完了?
@RosonJ: 处理完界面会返回结果的(按钮变绿之类的),但是按钮一直没有变绿。
@😀明笔记:
你說線程都停止工作,但工作卻還沒有處理完(因為按鈕還沒有變綠)
這不就跟我說的一樣,線程在等待,所以工作沒做完卻暫停
@RosonJ: 你的意思是。线程等待太多会导致卡顿?比如6个线程都写数据到dgv表格里,5个线程都在等待的话。就会卡死?
@😀明笔记:
是的,但問題不在線程的數量
而是,目標表格只有一個,為什麼需要使用多線程?
@RosonJ: 因为项目需求要收集6个仪器的数据到表格里,而且是在一条流水线上,都是靠通讯的方式获取数据,然后线程操作到表格里
@RosonJ: 目标只有表格一个。只要加了lock应该没问题的把?
@😀明笔记:
@RosonJ: 2个串口通讯(相当于两个线程把)还有4个TCP通讯(这里有四个接受线程)、这6个线程合并不了把??
锁的话。肯定会释放的。写完数据就释放
@😀明笔记:
如果是這樣,那問題就在於,你的代碼是如何判斷六個線程的工作都完成了?
@RosonJ: 这个确实不清楚是否都完成了。-我加个日志看看
委托+线程 +sleep 吧
那最终执行完。软件应该会恢复的把?为什么一直卡死呢?
@😀明笔记: 你这个程序主要是干啥的? 时间比较久
一般直接卡死,就是数据量比较大,磁盘读写不够.
@Cgrain: 接受2个串口数据和4个TCP发送过来的数据,并进行汇总到datagridview表格里
@😀明笔记: 你只是用线程接收数据,没用委托+线程显示数据到 datagridview ?
@Cgrain: 有,线程里有委托
@😀明笔记: 你把 汇总到的 datagridview 数据,写入记事本,看看卡不卡,如果不卡的话,就是在重绘datagridview 的时候读写速度跟不上,否则就是数据量来的太快,太大,写入跟不上
@Cgrain: 汇总数据到dgv的时候,也同时会写入表格里的。读写速度跟不上,会导致软件直接卡死不动了??只能强行任务管理器退出
@😀明笔记: 你跑的时候打开任务管理器啊 看看,磁盘使用,CPU使用效率
@Cgrain: CPU使用率太高的话。是不是电脑的其他软件也会跟着卡?目前只发现只是我写的软件卡死,电脑其他的软件不会卡哦,这样是不是排除了CPU使用率太高的原因了?
@😀明笔记: 不一定啊,相当于你 的这个winform 是一个进程,其他软件又是一个进程,只不过是你这个进程资源占用大
@Cgrain: 哦!了解!
设断点,写日志。看看哪里卡住了
已经加上了,只是这个问题是偶然性的,现在还没出现问题-
即使代码不是自己的,一般调试工具也就能查看出来,在看不出来就CLR Profile,再不行winDbg。
调试没问题,没有报错,直接就是卡着界面
一定是线程出现的异常,导致UI卡死