我使用优秀的 OmniThreadLibrary 库来实现线程源代码解析,程序需要放弃现有的解析并在源代码更改时重新开始解析。
我使用下面显示的代码片段执行此操作,这是正确的方法吗?我还需要检查函数Terminated
中线程的属性吗?ThreadedParseHtml
if FParserThread <> nil then
begin
FParserThread.RemoveMonitor;
FParserThread.Terminate(500);
end;
FParserThread := CreateTask(ThreadedParse);
FParserThread.SetParameter('SourceCode', Editor.Lines.Text);
FParserThread.MonitorWith(FParserThreadMonitor);
FParserThread.Run;
提前致谢!
编辑1:很抱歉重新打开这个问题,但我发现内存泄漏时FParserThread
没有通过调用该Terminate
方法并给定足够的时间自行完成......关于什么可能导致内存泄漏的任何想法?谢谢!
编辑2:阅读这篇博文,我仍然无法弄清楚问题可能是什么,因为在ThreadedParse
代码中的每一步之后如果Terminated
是真的......
编辑 3:回答 Rob 的问题:
在 OnTerminated 事件处理程序(此处未显示)中,FParserThread 设置为“nil”,因此“FParser 自行完成”是指该
if FParserThread <> nil then
块未执行,在这种情况下,FParserThread 被终止,因为它的解析已完成。代码背后的逻辑是,这是一个代码编辑器,在任何代码编辑时都会启动一个线程来将源代码解析为内部树表示,以防发生新的代码编辑但之前的解析线程没有被编辑过,程序会先强制上一个解析线程再启动一个新的解析线程。这可能不是一个好方法......
编辑4:在阅读了这个类似的SO问题之后,我将代码更改为FParserThread.Terminate
不带参数的调用,这意味着,如果我理解正确,该语句只会发出线程结束的信号,并且在实际线程任务中,我将逻辑应用于如果Terminated
属性为,则退出线程执行True
。
现在的连线是,在Tracetool的帮助下,我发现在调用事件(我清理内存FParserThread.Terminate
的OnTaskMessage
地方)后不会再次触发,这就是导致内存泄漏的原因......