一个可能是线程安全的日志记录类_ulog线程安全吗-程序员宅基地

技术标签: string  constructor  thread  list  class  

unit ULog;

interface

uses
  Classes;

type
  TLogThread = class(TThread)
  private
    { Private declarations }
    private FLogFile:string;
    private FTextList:TThreadList;
    procedure DoWriteLog;
  protected
    procedure Execute; override;
  public
    constructor Create(AFileName:string);
    procedure WriteLog(AText:String);
  end;

implementation
uses SysUtils;
type
  TLogLine=class
  private
    Text:String;
  end;


{ TLogThread }

constructor TLogThread.Create(AFileName: string);
var
  dir:string;
begin
  FTextList:=TThreadList.Create;
  dir:=SysUtils.ExtractFileDir(AFileName);
  if not DirectoryExists(dir) then
    ForceDirectories(dir);
  if not FileExists(AFileName) then
  begin
    with TStringList.Create do
    try
      SaveToFile(AFileName);
    finally
      Free;
    end;
  end;
  FLogFile:=AFileName;
  FreeOnTerminate:=true;
  Inherited Create(false);
end;

procedure TLogThread.DoWriteLog;
var
  line:TLogLine;
  list:TList;
  logFile:Text;
begin
    list:=FTextList.LockList;
    try
      if list.Count>0 then
      begin
       AssignFile(logFile,FLogFile);
       Append(LogFile);
        try
          while list.Count>0 do
          begin
            line:=TLogLine(list[0]);
            WriteLn(LogFile,line.Text);
            list.Delete(0);
            line.Free;
          end;
          Flush(logFile);
          Close(logFile);
        except
        end;
      end;
    finally
      FTextList.UnlockList;
    end;
end;

procedure TLogThread.Execute;
begin
  { Place thread code here }
  repeat
    DoWriteLog;
    if not Terminated then
      sleep(100);
  until self.Terminated;
  DoWriteLog;
  FTextList.Free;
end;

procedure TLogThread.WriteLog(AText: String);
var
  line:TLogLine;
begin
  line:=TLogLine.Create;
  line.Text:=Format('%s %s',[formatdatetime('[HH:mm:ss:zzz]',now),AText]);
  FTextList.Add(line);
end;

end.


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mu_x/article/details/7672139

智能推荐

深度学习04—反向传播算法(用于参数更新、troch实现)_反向传播实例及代码-程序员宅基地

文章浏览阅读4.6k次,点赞11次,收藏57次。(1)反向传播:该方法主要是应用链式法则的方法,求loss关于w和b的导数;(2)关于如下步骤中,l.backward()会将前向的各部梯度存入,而红色的两个代码会形成“计算图”;(3)其中:w是Tensor(张量类型),Tensor中包含data和grad,data和grad也是Tensor。grad初始为None,调用l.backward()方法后w.grad为Tensor,故更新w.data时需使用w.grad.data。_反向传播实例及代码

MongoDB复杂分组聚合查询_mongodb分组查询-程序员宅基地

文章浏览阅读3.7k次,点赞4次,收藏16次。目录1 聚合查询1.1 MongoDB的聚合查询2 聚合管道方法2.1 聚合流程2.1.1 详细流程2.2 聚合语法2.2.1 参数说明2.2.2 注意事项2.3 常用聚合管道2.3.1 与mysql聚合类比3 使用示例3.1 统计所有数据3.2 对所有城市人数求合3.3 对城市缩写相同的城市人数求合3.4 state重复的城市个数3.5 state重复个数大于100的城市4 MapReduce4.1 什么是MapReduce4.1.1 执行阶段4.1.2 语法_mongodb分组查询

云服务器可以改系统吗,云服务器可以改系统吗?-程序员宅基地

文章浏览阅读788次。云服务器可以改系统吗?腾佑小编给出的答案是:可以的,云服务器可以改系统,不过更换系统是一个高风险操作。在更换系统盘之前,务必认真阅读服务商给出的注意事项。云服务器改系统的风险有:1.原系统盘的会被释放,建议提前创建快照备份数据。2.更换系统盘需要停止实例,因此会中断网站的业务。3.更换完成后,需要在新的系统盘中重新部署业务运行环境,有可能会对业务造成长时间的中断。更换系统盘相当于重新为云服务器实例...

Xilinx zynqmp USB开发-程序员宅基地

文章浏览阅读6.1k次,点赞4次,收藏35次。参考Linux USB DWC3 Host/Peripheral DriverZynq Ultrascale MPSOC Linux USB device driverU-Boot USB DriverZynq UltraScale+ MPSoC USB 3.0 Mass Storage Device Class DesignZynq UltraScale+ MPSoC USB 3.0...

离散余弦变换(DCT)的来龙去脉_dcd余弦变化-程序员宅基地

文章浏览阅读5.8w次,点赞40次,收藏238次。本文主要介绍离散余弦变换(DCT),从图像的二维离散变换入手,引出变换核的可分性与对称性导出DCT,并给出实现代码。_dcd余弦变化

使用python的requests 发送multipart/form-data 请求-程序员宅基地

文章浏览阅读3.9w次,点赞5次,收藏23次。发送post请求 1 r = requests.post("http://pythontab.com/postTest", data = {"key":"value"}) 以上得知,post请求参数是以data关键字参数来传递的。现在的data参数传递的是字典,我们也可以传递一个json格式的数据,如下: 1 2 3 ...

随便推点

支付宝对账单下载Java正式商户调用-程序员宅基地

文章浏览阅读204次。package code;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLExcep..._java商家 alipay 账单拉取

学java对笔记本配置有何要求_java程序员应该配置什么样的笔记本-程序员宅基地

文章浏览阅读2.6k次。入门JAVA程序员需要配置什么样的笔记本?一般java程序员使用的笔记本配置有多高,怎么样才能让java程序员安心的工作!要求:1.可以运行MyEclipse,Tomcat,MySQL,oracle,flex等java web编程的软件。可能还会涉及到安卓开发。2.偶尔看看电影什么的。3.内存最好大一点,不然运行代码怕占用内存太高。5.屏幕最好能稍微大一点,看电影,敲代码会更舒服一点。6.预算在5..._java程序员笔记本配置

Python模块:基本概念、2种导入方法(import与from...import)和使用-程序员宅基地

文章浏览阅读1w次,点赞37次,收藏221次。模块是python程序架构的一个核心概念。每一个以扩展名py结尾的python源代码文件都是一个模块,模块名同样也是一个标识符,需要符合标识符的命名规则,在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具,模块就好比工具包,要想使用这个工具包中的工具,就需要先的导入这个模。

100天精通Python(数据分析篇)——第70天:Pandas常用排序、排名方法(sort_index、sort_values、rank)_pandas rank sort_value-程序员宅基地

文章浏览阅读1.3w次,点赞69次,收藏69次。一、按索引排序:sort_index() 1. Series类型排序 1)升序 2)降序 2. DataFrame类型排序 1)按行索引排序 2)按列索引排序二、按值排序:sort_values() 1. Series类型排序 1)升序 2)降序 2. DataFrame类型排序 1)单列排序 2)多列排序 3)排序算法 _pandas rank sort_value

Java基础面试题(2022最新版汇总)_白大锅,java基础面试题(2022最新版汇总)-程序员宅基地

文章浏览阅读10w+次,点赞597次,收藏3.5k次。史上最全、最新、最详细的Java基础面试题汇总_白大锅,java基础面试题(2022最新版汇总)

OPC UA Java 开发笔记(三):open62541建立基础服务器_java open62541-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏9次。前两天一直在搞open62541,因为milo库的server sdk没有办法根据xml生成结点文件,于是准备用open62541来搭建服务器,milo结合Spring Boot来构件客户端。网络上大多是建立一个open62541.h的头文件,还有就是open62541.c的执行文件,但是新版好像并不是这样的。然后很多教程都是讲的linux,但是初学者用linux的还是比较少,所我写了这一篇帮..._java open62541

推荐文章

热门文章

相关标签