pascal语言泛型和模板

news/2025/2/6 9:45:36/文章来源:https://www.cnblogs.com/hnxxcxg/p/18700579

pascal语言泛型和模板,适用于FPC和delphi。

泛型是一种编程思想,模板是实现这种思想的具体工具。

泛型编程的目标是写出与类型无关的代码,而模板提供了这种能力。

模板不是真正的代码,而是生成代码的规则。

编译器在编译期根据具体类型实例化模板,对每个不同类型都会生成一份独立的代码。

1)定义泛型模板

//cxg 2025-2-6
//池的泛型模板  fit lazarus+delphi
unit sys.pool;
{$ifdef fpc}{$mode delphi}{$H+}
{$endif}interfaceuses//system--------
  Generics.Collections, Classes, SysUtils;typeTPool<T> = classprivate//池中的对象FList: TthreadList<T>;//池大小
    FPoolSize: Integer;publicconstructor Create(poolSize: Integer); virtual;destructor Destroy; override;public//初始化,往池中一次性创建poolsize数量的对象
    procedure Init;//新建一个对象function NewObj(owner: TComponent = nil): T; virtual; abstract;//从池中取一个对象function Lock: T; virtual;//对象归还池中procedure Unlock(Value: T); virtual;end;implementationconstructor TPool<T>.Create(poolSize: Integer);
beginFList := TThreadList<T>.Create;Self.FPoolSize := poolSize;    //根据实际情况,合理设置
end;destructor TPool<T>.Destroy;
beginFList.Clear;FreeAndNil(FList);inherited Destroy;
end;procedure TPool<T>.Init;
varlist: TList<T>;
beginlist := FList.LockList;trywhile list.Count < Self.FPoolSize doList.Add(NewObj);finallyFList.UnlockList;end;
end;function TPool<T>.Lock: T;
varlist: TList<T>;
beginlist := FList.LockList;tryif list.Count > 0 thenbeginResult := list.First;List.Remove(Result);endelsebegin //池中已无可用对象,池容量+1
      List.Add(NewObj);Result := list.First;List.Remove(Result);end;finallyFList.UnlockList;end;
end;procedure TPool<T>.Unlock(Value: T);
beginFList.Add(Value);
end;end.

2)具体类型实例化模板一

unit sys.threadpool;
//cxg 2025-2-6
//线程池  fit lazarus+delphi
{$ifdef fpc}{$mode delphi}{$H+}
{$endif}interfaceuses//my----------
  sys.pool, //system--------
  classes, SysUtils, SyncObjs;typeTproc1 = TThreadMethod;   //procedure of object
  {$ifndef fpc}Tproc2 = TThreadProcedure; //reference to procedure fpc3.3.1才支持
  {$endif}Ttread1 = class(TThread)privateFproc1: Tproc1;{$ifndef fpc}Fproc2: Tproc2;{$endif}Fevent: TEvent;FtaskFinished: Boolean; //任务执行完成否publicconstructor Create; overload;procedure execute; override;//恢复线程
    procedure start;//挂起线程
    procedure stop;public//线程要执行的方法 procedure of object
    property proc1: Tproc1 read Fproc1 write Fproc1;//线程要执行的方法 reference to procedure
    {$ifndef fpc}property proc2: Tproc2 read Fproc2 write Fproc2;{$endif}//任务执行完成否
    property taskFinished: Boolean read FtaskFinished;end;typeTthreadpool = class(TPool<Ttread1>)publicfunction NewObj(owner: TComponent = nil): Ttread1; override;procedure Unlock(Value: Ttread1); override;end;implementation{ Tthreadpool }function Tthreadpool.NewObj(owner: TComponent): Ttread1;
beginResult := Ttread1.Create;
end;procedure Tthreadpool.Unlock(Value: Ttread1);
begin//必须等待线程的任务执行完成,才能归还池中while not Value.taskFinished doSleep(1);inherited;
end;{ Ttread1 }constructor Ttread1.Create;
begininherited Create(False);Fevent := TEvent.Create(nil, False, False, '');
end;procedure Ttread1.execute;
beginwhile not Terminated dobeginFevent.Acquire;FtaskFinished := False;         //任务正在执行if Assigned(Fproc1) thenFproc1;{$ifndef fpc}if Assigned(Fproc2) thenFproc2;{$endif}FtaskFinished := True;          //任务执行完成
  end;
end;procedure Ttread1.start;
beginFevent.SetEvent;
end;procedure Ttread1.stop;
beginFevent.ResetEvent;
end;end.

3)具体类型实例化模板二

unit db.datasetpool;
//cxg 2025-2-6
//数据集池 fit lazarus+delphi
{$ifdef fpc}{$mode delphi}{$H+}
{$endif}
interfaceuses//my-------
  sys.pool,//system-----
  {$IFDEF fpc}fpjsondataset,{$ELSE}firedac.comp.Client,{$ENDIF}classes, DB, SysUtils;typeTdatasetPool = class(TPool<Tdataset>)publicfunction NewObj(owner: TComponent = nil): Tdataset; override;procedure unlock(value: Tdataset); override;end;implementation{ TdatasetPool }function TdatasetPool.NewObj(owner: TComponent): Tdataset;
begin{$IFDEF fpc}Result := Tjsondataset.create(nil);{$ELSE}Result := TFDMemTable.Create(nil);{$ENDIF}
end;procedure TdatasetPool.unlock(value: Tdataset);
beginvalue.close;inherited;
end;end.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简易美观!一个浏览器首页导航面板!

sun-panel —— 个 NAS、服务器导航面板、简易 Docker 管理器、Homepage、浏览器首页。大家好,我是 Java陈序员。 之前给大家介绍一款基于 GitHub Pages 配置实现的导航页面。 贼好用!五分钟搭建一个美观且易用的导航页面! 今天,再给大家介绍一个简易美观的浏览器首页导航面…

电脑屏幕出现一条灰色横线的解决办法

在桌面空白处右击,选择显示设置,调整更改文本、应用等项目的大小,修改为125%,再修改为100%即可

[CSharpTips]C# 获取当前方法名

获取当前方法名 添加System.Runtime.CompilerServices 命名空间 添加 "GetCallerName"方法如下,在方法中调用此方法便可获取当前方法名1 using System;2 using System.Runtime.CompilerServices;3 4 namespace GetCallerNameTest5 {6 internal class Program7 …

大模型实战:基于腾讯云HAI服务轻松部署 DeepSeek-R1图文教程

近期在AI领域最火的莫过于DeepSeek模型,DeepSeek-R1 已发布并开源,性能直接对标 OpenAl o1 正式版。作为一名AI爱好者来说还是希望能够亲自体验一下DeepSeek-R1的真实效果。正好腾讯云HAI服务提供了非常友好的方式,仅仅需要三分钟就可以轻松部署DeepSeek-R1,今天就来给大家…

DeepSeek-R1在个人电脑本地部署

最近DeepSeek大火,人工智能未来将对工作生活带来很大的改变。 除了在服务器上部署外,我想在本地笔记本上部署一个,当遇到离线环境的时候,依然可以使用人工智能辅助。 本地部署很简答, 一条命令就可以了,下面是部署和测试验证的一些要点记录。 1.安装准备 Ollama下载和安装…

康熙字典存世的几种版本分析-附《康熙字典》电子版全文在线查询

《康熙字典》作为中国历史上重要的字书之一,自清康熙五十五年(1716年)成书以来,历经多次刊刻、修订和重印,形成了多种存世版本。这些版本在内容、版式、校勘和印刷技术上存在差异,具有不同的文献价值和收藏价值。《康熙字典》作为中国历史上重要的字书之一,自清康熙五十…

美国支付清算体系介绍

美国的支付清算体系是全球最复杂、最多样化的金融基础设施之一,支撑着庞大的国内经济和全球金融活动。本文将详细介绍美国支付清算体系的主要组成部分,包括银行间支付系统(如Fedwire和CHIPS)和零售支付系统(如ACH、Zelle、RTP),并探讨它们的特点和应用场景。通过对比中国…

学习 -人工智能 - AI Agent的理解

浅谈AI Agent的理解 Agents是什么? 大语言模型可以接收输入、可以分析&推理、可以输出文字、代码、媒体。然而其无法像人类一样,拥有规划思考能力、运用各种工具与物理世界互动,以及拥有人类的记忆能力。 AI Agents是基于LLM能够自助理解、自主规划决策、执行复杂任务的…

dotnet LibGit2Sharp 使用笔记

本文记录我对 LibGit2Sharp 库的使用笔记LibGit2Sharp 库开源地址: https://github.com/libgit2/libgit2sharp 本文使用的版本是: 0.31.0 按照 dotnet 的惯例,使用之前先用 NuGet 安装,安装之后的 csproj 文件代码大概如下 <Project Sdk="Microsoft.NET.Sdk"&…

dotnet 9 已知问题 默认开启 CET 导致进程崩溃

本文记录 dotnet 9 的一个已知且当前已修问题。默认开启 CET 导致一些模块执行时触发崩溃官方文档: Breaking change: CET supported by default - .NET Microsoft Learn 表现: 调用 OpenFileDialog 的 ShowDialog 将会异常崩溃,崩溃异常是 FAST_FAIL_SET_CONTEXT_DENIED 或…

读算法简史:从美索不达米亚到人工智能时代08组合优化

读算法简史:从美索不达米亚到人工智能时代08组合优化1. 组合优化 1.1. 蛮力搜索算法会尝试所有可能的组合并从中选择最好的那个 1.2. 旅行商问题是众多组合优化(combinatorial optimization)问题中的一个,它要求许多固定元素以可能的最佳方式进行组合1.2.1. 固定元素可以有无…