mormot.core.threads--TSynThread

打印 上一主题 下一主题

主题 869|帖子 869|积分 2617

mormot.core.threads--TSynThread
  1. { ************ 面向服务器进程的线程池 }
  2. type
  3.   {$M+} // 开启内存管理消息,用于调试
  4.   /// 一个简单的TThread,具有在线程上下文中运行的"Terminate"事件
  5.   // - TThread.OnTerminate事件在Synchronize()内部运行,因此不符合我们的期望,
  6.   // 即在线程创建的上下文中释放资源(例如,对于COM对象或某些数据库驱动程序)
  7.   // - 由THttpServerGeneric.NotifyThreadStart()内部使用 - 您不应该使用受保护的fOnThreadTerminate事件处理程序
  8.   // - 还定义了一个Start方法,以与Delphi的旧版本兼容
  9.   TSynThread = class(TThreadAbstract)
  10.   protected
  11.     fStartNotified: TObject; // 标记线程是否已通知开始
  12.     // 我们定义了一个fOnThreadTerminate事件,该事件将在终止的线程上下文中运行
  13.     // (而TThread.OnTerminate在主线程中调用)
  14.     // -> 参见THttpServerGeneric.OnHttpThreadTerminate事件属性
  15.     fOnThreadTerminate: TOnNotifyThread;
  16.     procedure DoTerminate; override; // 重写DoTerminate方法
  17.   public
  18.     /// 初始化线程实例,处于非挂起状态
  19.     constructor Create(CreateSuspended: boolean); reintroduce; virtual;
  20.     /// Sleep的安全版本,不会中断线程进程
  21.     // - 如果线程已终止,则返回TRUE
  22.     // - 如果成功等待了MS毫秒,则返回FALSE
  23.     function SleepOrTerminated(MS: cardinal): boolean;
  24.     /// 确保仅在NotifyThreadStart完成后调用fOnThreadTerminate
  25.     property StartNotified: TObject
  26.       read fStartNotified write fStartNotified;
  27.   end;
  28.   /// 实现具有开始/停止通知功能的线程的抽象类
  29.   // - 例如,服务器线程
  30.   // - 不要使用这个类,而是使用THttpServer, THttpApiServer或TWebSocketServer(如mormot.net.websock中定义的)
  31.   TNotifiedThread = class(TSynThread)
  32.   protected
  33.     fProcessName: RawUtf8; // 进程名称
  34.     fOnThreadStart: TOnNotifyThread; // 线程开始通知事件
  35.     procedure SetOnTerminate(const Event: TOnNotifyThread); virtual; // 设置线程终止事件
  36.     procedure NotifyThreadStart(Sender: TSynThread); // 通知线程开始
  37.   public
  38.     /// 初始化服务器实例,处于非挂起状态
  39.     constructor Create(CreateSuspended: boolean;
  40.       const OnStart, OnStop: TOnNotifyThread; // 开始和停止通知事件
  41.       const ProcessName: RawUtf8); reintroduce; virtual;
  42.     /// 将每个线程分配给单个逻辑CPU核心
  43.     // - 例如,对于HTTP服务器,它可能确保具有短生命周期请求和高线程数的更好的可扩展性
  44.     procedure SetServerThreadsAffinityPerCpu(
  45.       const log: ISynLog; const threads: TThreadDynArray);
  46.     /// 将每个线程分配给单个硬件CPU插槽
  47.     // - 例如,对于具有多个物理CPU包的复杂硬件上的HTTP服务器,它可能确保更好的可扩展性
  48.     // - 但这非常挑剔,因此仅应在实际硬件上进行适当测试后才能启用
  49.     procedure SetServerThreadsAffinityPerSocket(
  50.       const log: ISynLog; const threads: TThreadDynArray);
  51.   end;
  52.   /// 实现具有日志通知功能的线程的抽象类
  53.   TLoggedThread = class(TSynThread)
  54.   protected
  55.     fProcessName: RawUtf8; // 进程名称
  56.     fLogClass: TSynLogClass; // 日志类
  57.     fLog: TSynLog; // 在DoExecute线程上下文中的日志实例
  58.     fProcessing: boolean; // 标记线程是否正在处理
  59.     procedure Execute; override; // 重写Execute方法
  60.     // 继承类应该重写此方法以实现适当的处理逻辑
  61.     procedure DoExecute; virtual; abstract;
  62.   public
  63.     /// 初始化服务器实例,处于非挂起状态
  64.     constructor Create(CreateSuspended: boolean; Logger: TSynLogClass;
  65.       const ProcName: RawUtf8); reintroduce; virtual;
  66.     /// 通知线程终止,并等待DoExecute完成
  67.     procedure TerminateAndWaitFinished(TimeOutMs: integer = 5000); virtual;
  68.     /// 关联的日志类
  69.     property LogClass: TSynLogClass
  70.       read fLogClass;
  71.   published
  72.     /// 此线程的名称,作为SetCurrentThreadName()的参数提供
  73.     property ProcessName: RawUtf8
  74.       read fProcessName;
  75.   end;
  76.   /// 在后台线程中由TLoggedWorkThread.Create调用的事件
  77.   TOnLoggedWorkProcess = procedure(const Context: TDocVariantData) of object;
  78.   /// 一个能够在后台线程中运行某些进程,并具有适当日志记录和最终通知功能的类
  79.   TLoggedWorkThread = class(TLoggedThread)
  80.   protected
  81.     fSender: TObject; // 发送者对象
  82.     fOnExecute, fOnExecuted: TNotifyEvent; // 执行前后的事件
  83.     fOnExecuteParam: TOnLoggedWorkProcess; // 执行参数的事件
  84.     fContext: TDocVariantData; // 上下文数据
  85.     procedure DoExecute; override; // 重写DoExecute方法
  86.   public
  87.     /// 此构造函数将直接在后台启动线程
  88.     // - 上下文作为常规的TNotifyEvent
  89.     constructor Create(Logger: TSynLogClass; const ProcessName: RawUtf8;
  90.       Sender: TObject; const OnExecute: TNotifyEvent;
  91.       const OnExecuted: TNotifyEvent = nil);
  92.         reintroduce; overload;
  93.     /// 此构造函数将直接在后台启动线程
  94.     // - 上下文作为具有名称/值对的TDocVariantData对象
  95.     constructor Create(Logger: TSynLogClass; const ProcessName: RawUtf8;
  96.       const NameValuePairs: array of const; const OnExecute: TOnLoggedWorkProcess;
  97.       const OnExecuted: TNotifyEvent = nil);
  98.         reintroduce; overload;
  99.   end;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

篮之新喜

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表