开源改变世界!!

内存泄漏 #67

推推 grbl 2年前 (2023-02-10) 91次浏览
关闭
canbaytok 打开了这个问题 2018 年 8 月 30 日 · 3条评论
关闭

内存泄漏#67

canbaytok 打开了这个问题 2018 年 8 月 30 日 · 3条评论

评论

内存泄漏 #67

嗨马丁!

在铣完一块新的 PCB 并在晚上查看任务管理器后,我注意到后台运行着三个 OpenCNCPilot 进程。他们不使用任何处理器时间,所以我真的不介意,但不得不手动关闭它们仍然有点烦人。我试图重新创建此错误并找到了罪魁祸首。当您断开与 CNC 的 USB 连接并关闭 OpenCNCPilot 时,串行连接不会终止,只会在后台运行(?)。我这样做了七次,只是为了 100% 确定:

内存泄漏 #67

我查看了代码并尝试对其进行调试,但不幸的是,当涉及到 C# 中的线程时,我并不是那么了解(我自己更像是一个任务专家 :D)。不过,我确实发现问题似乎出在“WorkerThread.Join ( );” 在“Machine.cs”文件的第 538 行调用。“Join()”方法应该等待“WorkerThread”完成并终止(?),但不知何故从未发生过,因此连接不会关闭并阻止程序退出。

内存泄漏 #67
所有者

你好,

最后!我知道这个问题并实际实施了一个解决方法(显然不起作用)。既然我知道去哪里找,我会尝试解决这个问题。诚然,我在任务和线程方面都没有经验,所以这会很有趣:D

谢谢!

内存泄漏 #67
作者

好吧,我找到了解决方案。问题在于您如何处理“Work()”方法中的异常。
当您按下断开连接按钮时,主线程执行“Disconnect”方法并将“Connected”变量设置为 false,以便“Work”线程知道它应该跳出 while 循环并完成执行(“WorkerThread. Join()”方法将允许程序继续执行)。但是,如果连接中断,则执行 catch 表达式并且 WorkerThread 调用“Disconnect”方法。“Disconnect”-方法等待 WorkerThread 完成执行,但 WorkerThread 等待“Disconnect”-方法完成执行。所以这两个进程都等待各自完成,

解决方案是使用“RaiseEvent”方法,它接受一个“Action”。使用“RaiseEvent”方法的好处是它调用动作并告诉主线程执行它。因此,通过将“RaiseEvent”方法传递给“Disconnect”调用,“RaiseEvent”将告诉主线程调用“Disconnect”,就像按下断开按钮一样。我知道这听起来很混乱,但毕竟线程很混乱 :D

另一个出现的问题是“Connection”无法关闭,因为在连接中断的时候关闭了,导致异常。我只是将“Connection.Close()”调用包装在一个 try-catch 表达式中,并以此抑制了异常。

修复不需要大量代码修改,所以我将它们粘贴在这里:

“机器。工作()”
内存泄漏 #67

“机器。断开连接()”
内存泄漏 #67

内存泄漏 #67
所有者

再次嗨,
非常感谢您的工作,我会尽快包含此修复程序!

马丁