日志记录和同步

2024-01-13

我刚刚编写了自己的日志框架(非常轻量级,不需要大型日志框架)。它由一个接口 ILogger 和许多实现该接口的类组成。我有一个问题是 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;

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

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

我在这里做错了什么?

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

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

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


如果将 CurrentThreadID 与 MainThreadID 进行比较,则可以选择同步或不同步。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日志记录和同步 的相关文章

  • 安装软件包时出现无法加载软件包 %s 错误

    我正在 Delphi 2007 上进行测试 我的小组项目由 2 个包组成 包运行 bpl 它被标记为 仅运行时 并包含一个名为 uMyTestRun pas 的单元 其中定义了一个空的 TFrame 后代 unit uMyTestRun i
  • 从 C++ .dll 到 Delphi Forms 应用程序的 PostMessage 问题

    我有用 Delphi 7 编写的 Windows 窗体应用程序和使用 MFC 编写的 C dll 目前 我正在尝试实现从 dll 到主可执行文件的基本消息发布 以在进度条上显示用户计算过程 但遇到了几个问题 让我先描述一下我的方法 我在 D
  • 如何制作自定义组件属性?

    我需要帮助来制作一个控件属性 当您单击它时 它会弹出一个自定义对话框 例如设置 就像 TPicture 一样 有什么想法或建议吗 如果您的类用作其他组件的属性 并且您想使用对象检查器来调用对话框 那么您必须实现并注册一个自定义属性编辑器 例
  • 如何隐藏主窗体而不是关闭它?

    如果用户点击X在我的主窗体上 我希望窗体隐藏 而不是关闭 这听起来像是一份工作OnClose表单事件 http docs embarcadero com products rad studio delphiAndcpp2009 HelpUp
  • Delphi TTask - PPL 中匿名函数中的变量捕获如何工作?

    我开始深入研究 Delphi D11 PPL 并编写了这个小例子 procedure TForm2 LaunchTasks const cmax 5 Var ltask ITask i j Integer begin for i 1 to
  • Java 中的 Thread.stop 和它的朋友安全吗?

    The stop suspend and resume in java lang Thread已被弃用 因为它们是unsafe http docs oracle com javase 7 docs technotes guides conc
  • 如何取消注册我的应用程序的文件格式?

    在 Windows 10 中的 Delphi 10 4 2 win 32 VCL 应用程序中 我注册了 ICO我的图形应用程序的文件格式使用DSiWin32 DSiRegisterUserFileAssoc https github com
  • 我如何淡入/淡出 TImage?

    我有一个简单的TForm命名为Form1 Image1 是一个TImage加载了一个 PNGImage 和一个 Button1TButton测试事物 成功实现了对图像1的Alpha Blend的方法 代码如下 procedure SetPN
  • 在Service中使用Looper和使用单独的线程是一样的吗?

    在此示例中 来自文档 https developer android com guide components services html ExtendingService https developer android com guide
  • Node.js 多线程程序

    我编写了一个 node js 脚本来从交易所获取一些价格 它看起来像这样 async function main async function func var start time performance now for let rout
  • 单线程应用程序中的同步方法是否较慢?

    在过去的几分钟里 我一直在与自己争论这个问题 我找到了 是 和 否 的理由 这源于查看答案Java HashMap 与 Hashtable https stackoverflow com questions 40471 java hashm
  • Delphi - 引用在运行时创建的组件

    我正在使用 Delphi 5 并且在运行时创建许多面板 然后在面板上创建按钮 显然也是在运行时创建 我需要这样做 因为将来我可能需要动态创建更多面板 按钮组合 我可以完成所有这些 但我不知道如何引用我创建的面板 因为我找不到访问面板组件名称
  • 如何在TWebBrowser中显示相对路径图像?

    我正在 DesignMode Doc DesignMode On 中使用 TWebBrowser 来编写 HTML 文档 TWebBrowser 中没有加载文档 磁盘上的 HTML 文件 我直接在 TWebBrowser 中从零开始创建文档
  • 多线程归并排序,添加额外的线程

    我在java中的多线程合并排序算法中面临一个问题 我应该将代码修改为 3 4 5 6 7 8 线程合并排序 将原始数组划分为subArrays 目前它有2subArrays 如何将原始数组拆分为 3 4 5 6 7 8subArray是为了
  • 流行的“易失性轮询标志”模式被打破了吗?

    假设我想使用布尔状态标志来进行线程之间的协作取消 我意识到人们最好应该使用CancellationTokenSource反而 这不是这个问题的重点 private volatile bool stopping public void Sta
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • 限制并行工作的线程数量

    我正在创建一个函数 将文件从本地计算机复制到远程创建线程以并行执行 sftp def copyToServer does copy file given host name and credentials for i in hostsLis
  • 在Delphi/Lazarus中设置提示窗口(THintWindow)的大小

    我正在尝试在 Lazarus 中进行自定义提示 到目前为止 我已经动态加载了提示中的文本 并自定义了字体 字体大小和字体颜色 我想限制提示窗口的宽度 有任何想法吗 这是我的代码 type TExHint class THintWindow
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P

随机推荐

  • 对 Arrays.asList() 中的列表进行排序也会更改原始数组吗?

    在对检索到的列表进行排序时 我注意到一个奇怪的行为 对我来说 Arrays asList 看来之后Collections sort list 原数组也已排序 这怎么可能 List
  • Python/OpenCV - 在 OpenCV 中使用两种不同的霍夫线方法检测网球场中的线 - 获得不同的结果

    我正在尝试使用 openCV 和霍夫变换检测网球场中的线 我想找到水平线和垂直线 以便找到交点并最终检测网球场的角落 Here the original image 但我有一些问题 1 我尝试使用 HoughLineP 这里的代码 gray
  • 从 QuickTime(电影)文件中获取缩略图

    有人知道是否有可能 在 PHP 中 从服务器上的 Quicktime 电影中获取帧 缩略图 类似于通常的 GD 缩略图生成 但适用于 mov 文件 注意 我使用的是 dreamhost 因此我只能通过 Web 面板访问服务器 这看起来很有希
  • 登录页面是否需要防伪令牌?

    我不断看到在标准用户名 密码登录页面上放置防伪令牌的代码示例 甚至 Asp Net Web 项目模板也能做到这一点 为什么 唯一改变的系统状态是用户的登录状态 为了实现这一点 攻击者需要他们的用户名和密码 这意味着一切都已经受到最大程度的损
  • 需要帮助根据真值表创建二叉树

    首先 为了充分披露 我想指出这与机器学习课程中的作业有关 这个问题不是家庭作业问题 而是我需要解决的问题 以便完成创建 ID3 决策树算法这一更大的问题 当给定真值表时 我需要生成类似于以下内容的树 let learnedTree Node
  • 将数字截断至小数点后两位而不进行四舍五入

    假设我的值为 15 7784514 我想将其显示为 15 77 不进行舍入 var num parseFloat 15 7784514 document write num toFixed 1 br document write num t
  • 如何在没有选择按钮的情况下在GridView中实现全行选择?

    我正在实现一项功能 当用户按下 GridView 中行中的任何点时 将选择该行而不是 选择 按钮 为了实现这一点 我使用以下代码 protected void GridView1 RowDataBound object sender Gri
  • 动态创建文件输入元素

    我想自定义文件输入按钮 所以我使用此代码创建一个文件输入元素 function inputBtn var input document createElement input input type file setTimeout funct
  • TensorFlow:如何根据历元设置学习率衰减?

    学习率衰减函数tf train exponential decay需要一个decay steps范围 每隔一段时间降低学习率num epochs 你会设置decay steps num epochs num train examples b
  • Apache、SSL 客户端证书、LDAP 授权

    我在 serverfault com 上发布了这个问题 但没有答案 所以我在这里尝试 是否可以混合 mod ssl 和 mod auth ldap 以便使用客户端证书进行身份验证并使用 mod auth ldap 进行授权 需要 ldap
  • javax.servlet.ServletException:包装器找不到 servlet 类

    我已经从 Jasper Reports for Java Developer 第 3 章 中制作了一个 servlet 它将在浏览器上显示 Jasper Report 该 Servlet 如下所示 public class FirstRep
  • 如何抑制 Visual Studio 2017 (C#) 中的初始构建后事件错误?

    我在 Visual Studio 2017 中有一个 C 解决方案 我还有一个名为的批处理脚本foobar bat其中包含以下代码 echo foobar error 1 This is a test error 我的目标是得到only当我
  • new之后直接调用方法?

    PHP 是否允许像这样调用新对象的方法 new CEntry new Control gt actuate 我可以传递一个新对象作为参数 如下所示new Control 然而 它似乎不喜欢 actuate 调用 我收到错误 Parse er
  • 如何使用 C++ 中具有多个参数的 if 语句调用多个函数

    该程序针对每种条件运行所有函数 而它应该只针对每种条件运行一个函数 为什么 我应该编写计算球体 圆柱体和圆锥体的体积和表面积的函数 我无法弄清楚是 if 语句弄乱了 还是函数本身弄乱了 该程序的理想输出如下 选择形状 1 球体 2 圆柱体
  • 从 node-mysql 连接到 Amazon RDS (MySQL) 时出错

    我正在尝试使用 felixge node mysql 包从 Lambda 中托管的 Nodejs 代码连接到我的 Amazon RDS MySQL 实例 我需要帮助来找出我做错了什么 我收到 连接 ETIMEDOUT 错误 我的代码托管在
  • 不同源文件中的 D 模板特化

    我最近问this https stackoverflow com questions 6328444 type classes in d有关如何在 D 中模拟类型类的问题 并建议了一种使用模板专业化来实现此目的的方法 我发现 D 无法识别不
  • 基于不同XAML的样式继承

    如何将样式中的 BasedOn 标记指定为在其他文件中定义的样式 Example Dictionary1 xaml 定义 在 Dictionary2 xaml 中我需要类似的东西
  • 从 pandas 数据框中删除闰年日

    我有福尔 数据框 datetime 2012 01 01 125 5010 2012 01 02 125 5010 2012 01 03 125 5010 2012 02 04 125 5010 2012 02 05 125 5010 20
  • 我是否需要担心“Rc”的开销?

    我是否正确地假设唯一 放慢速度 的事情Rc问题是它会在对象删除时检查是否释放该对象 除此之外 取消引用的开销是 多少 Rc 即我应该关心它吗 这两个函数几乎同样快吗 或者说速度上有明显的区别吗 fn test with box let b
  • 日志记录和同步

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