gpt4 book ai didi

multithreading - 日志记录和同步

转载 作者:行者123 更新时间:2023-12-03 15:44:16 25 4
gpt4 key购买 nike

我刚刚编写了自己的日志框架(非常轻量级,不需要大型日志框架)。它由一个接口(interface) ILogger 和许多实现该接口(interface)的类组成。我有一个问题是 TGUILogger,它采用 TStrings 作为日志记录目标,并将日志记录与主线程同步,以便可以将列表框的 Items 成员用作目标。

type
ILogger = Interface (IInterface)
procedure Log (const LogString : String; LogLevel : TLogLevel);
procedure SetLoggingLevel (LogLevel : TLogLevel);
end;

type
TGUILogger = class (TInterfacedObject, ILogger)
public
constructor Create (Target : TStrings);
procedure Log (const LogString : String; LogLevel : TLogLevel);
procedure SetLoggingLevel (LogLevel : TLogLevel);
private
procedure PerformLogging;
end;

procedure TGUILogger.Log (const LogString : String; LogLevel : TLogLevel);
begin
TMonitor.Enter (Self);
try
FLogString := GetDateTimeString + ' ' + LogString;
TThread.Synchronize (TThread.CurrentThread, PerformLogging);
finally
TMonitor.Exit (Self);
end;
end;

procedure TGUILogger.PerformLogging;
begin
FTarget.Add (FLogString);
end;

日志记录有效,但应用程序无法正确关闭。它似乎卡在类(class)单元中。堆栈跟踪:

System.Halt0、System.FinalizeUnits、Classes.Finalization、Classes.FreeExternalThreads、 System.TObject.Free,Classes.TThread.Destroy,Classes.TThread.RemoveQueuedEvents

我在这里做错了什么?

编辑:我刚刚在 Delphi 的 TThread.StaticSynchronize 帮助中找到了以下提示

Warning: Do not call StaticSynchronize from within the main thread. This can cause 
an infinite loop.

这可能正是我的问题,因为一些日志记录请求来自主线程。我该如何解决这个问题?

最佳答案

如果你比较CurrentThreadID和MainThreadID,那么你可以选择同步或不同步。

就我个人而言,我选择让 GUI 向日志系统询问最新信息,而不是让线程暂停。否则,您的日志记录会干扰线程的快速操作,从而违背了线程的目的。

关于multithreading - 日志记录和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/659094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com