📄 idschedulerofthread.pas
字号:
{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence }
{ Team Coherence is Copyright 2002 by Quality Software Components }
{ }
{ For further information / comments, visit our WEB site at }
{ http://www.TeamCoherence.com }
{**********************************************************************}
{}
{ $Log: 15084: IdSchedulerOfThread.pas
{
Rev 1.31 6/11/2004 8:48:32 AM DSiders
Added "Do not Localize" comments.
}
{
{ Rev 1.30 2004.03.01 5:12:38 PM czhower
{ -Bug fix for shutdown of servers when connections still existed (AV)
{ -Implicit HELP support in CMDserver
{ -Several command handler bugs
{ -Additional command handler functionality.
}
{
{ Rev 1.29 2004.02.03 4:17:04 PM czhower
{ For unit name changes.
}
{
{ Rev 1.28 2004.01.22 5:59:14 PM czhower
{ IdCriticalSection
}
{
{ Rev 1.27 2004.01.20 10:03:32 PM czhower
{ InitComponent
}
{
{ Rev 1.26 6/11/2003 8:28:42 PM GGrieve
{ remove wrong call to inherited StartYarn
}
{
{ Rev 1.25 2003.10.24 12:59:18 PM czhower
{ Name change
}
{
{ Rev 1.24 2003.10.21 12:19:00 AM czhower
{ TIdTask support and fiber bug fixes.
}
{
Rev 1.23 10/15/2003 8:35:30 PM DSiders
Added resource string for exception raised in TIdSchedulerOfThread.NewYarn.
}
{
{ Rev 1.22 2003.10.14 11:18:10 PM czhower
{ Fix for AV on shutdown and other bugs
}
{
{ Rev 1.21 2003.10.11 5:49:32 PM czhower
{ -VCL fixes for servers
{ -Chain suport for servers (Super core)
{ -Scheduler upgrades
{ -Full yarn support
}
{
{ Rev 1.20 2003.09.19 10:11:18 PM czhower
{ Next stage of fiber support in servers.
}
{
{ Rev 1.19 2003.09.19 11:54:30 AM czhower
{ -Completed more features necessary for servers
{ -Fixed some bugs
}
{
{ Rev 1.18 2003.09.18 4:43:18 PM czhower
{ -Removed IdBaseThread
{ -Threads now have default names
}
{
{ Rev 1.17 2003.09.18 4:10:26 PM czhower
{ Preliminary changes for Yarn support.
}
{
{ Rev 1.16 2003.07.17 1:08:04 PM czhower
{ Fixed warning
}
{
Rev 1.15 7/6/2003 8:04:06 PM BGooijen
Renamed IdScheduler* to IdSchedulerOf*
}
{
Rev 1.14 7/5/2003 11:49:06 PM BGooijen
Cleaned up and fixed av in threadpool
}
{
{ Rev 1.13 2003.06.30 9:39:44 PM czhower
{ Comments and small change.
}
{
Rev 1.12 6/25/2003 3:54:02 PM BGooijen
Destructor waits now until all threads are terminated
}
{
{ Rev 1.11 2003.06.25 4:27:02 PM czhower
{ Fixed some formatting and fixed one line ifs.
}
{
Rev 1.10 4/11/2003 6:35:28 PM BGooijen
}
{
Rev 1.9 3/27/2003 5:17:22 PM BGooijen
Moved some code to TIdScheduler, made ThreadPriority published
}
{
Rev 1.8 3/22/2003 1:49:38 PM BGooijen
Fixed warnings (.ShouldStop)
}
{
Rev 1.7 3/13/2003 10:18:30 AM BGooijen
Server side fibers, bug fixes
}
{
Rev 1.6 1/23/2003 11:55:24 PM BGooijen
}
{
Rev 1.5 1/23/2003 8:32:40 PM BGooijen
Added termination handler
}
{
Rev 1.3 1/23/2003 11:05:58 AM BGooijen
}
{
{ Rev 1.2 1-17-2003 23:22:16 BGooijen
{ added MaxThreads property
}
{
{ Rev 1.1 1/17/2003 03:43:04 PM JPMugaas
{ Updated to use new class.
}
{
{ Rev 1.0 1/17/2003 03:29:50 PM JPMugaas
{ Renamed from ThreadMgr for new design.
}
{
{ Rev 1.0 11/13/2002 09:01:32 AM JPMugaas
}
unit IdSchedulerOfThread;
(*
Changes
02 Oct 2001 - Allen O'Neill - Added support for thread priority - new property Threadpriority, new line added to OnCreate {Do not Localize}
*)
interface
uses
Classes,
IdException, IdBaseComponent, IdGlobal, IdScheduler, IdThread, IdTask, IdYarn;
type
TIdYarnOfThread = class(TIdYarn)
protected
FScheduler: TIdScheduler;
FThread: TIdThreadWithTask;
public
constructor Create(
AScheduler: TIdScheduler;
AThread: TIdThreadWithTask
); reintroduce;
destructor Destroy; override;
//
property Thread: TIdThreadWithTask read FThread;
end;
TIdSchedulerOfThread = class(TIdScheduler)
protected
FMaxThreads: Integer;
FThreadPriority: TIdThreadPriority;
//
procedure InitComponent; override;
public
destructor Destroy;
override;
function NewThread
: TIdThreadWithTask;
virtual;
function NewYarn(
AThread: TIdThreadWithTask = nil
): TIdYarnOfThread;
procedure StartYarn(
AYarn: TIdYarn;
ATask: TIdTask
); override;
procedure TerminateYarn(
AYarn: TIdYarn
); override;
published
property MaxThreads: Integer
read FMaxThreads
write FMaxThreads;
property ThreadPriority: TIdThreadPriority
read FThreadPriority
write FThreadPriority
default tpNormal;
end;
implementation
uses
IdResourceStringsCore, IdTCPServer, IdThreadSafe, IdExceptionCore,
SysUtils;
{ TIdSchedulerOfThread }
destructor TIdSchedulerOfThread.Destroy;
begin
TerminateAllYarns;
inherited;
end;
procedure TIdSchedulerOfThread.StartYarn(
AYarn: TIdYarn;
ATask: TIdTask
);
begin
with TIdYarnOfThread(AYarn).Thread do begin
Task := ATask;
Start;
end;
end;
function TIdSchedulerOfThread.NewThread: TIdThreadWithTask;
begin
EIdSchedulerMaxThreadsExceeded.IfTrue(
(FMaxThreads <> 0) and (ActiveYarns.IsCountLessThan(FMaxThreads + 1) = False)
, RSchedMaxThreadEx);
Result := TIdThreadWithTask.Create(nil, Format('%s User', [Name])); {do not localize}
if ThreadPriority <> tpNormal then begin
SetThreadPriority(Result, ThreadPriority);
end;
end;
function TIdSchedulerOfThread.NewYarn(
AThread: TIdThreadWithTask
): TIdYarnOfThread;
begin
EIdException.IfNotAssigned(AThread, RSThreadSchedulerThreadRequired);
// Create Yarn
Result := TIdYarnOfThread.Create(Self, AThread);
end;
procedure TIdSchedulerOfThread.TerminateYarn(AYarn: TIdYarn);
var
LYarn: TIdYarnOfThread;
begin
LYarn := TIdYarnOfThread(AYarn);
if LYarn.Thread.Suspended then begin
// If suspended, was created but never started
// ie waiting on connection accept
LYarn.Thread.Free;
FreeAndNil(LYarn);
end else begin
// Is already running and will free itself
LYarn.Thread.Stop;
// Dont free the yarn. The thread frees it (IdThread.pas)
end;
end;
procedure TIdSchedulerOfThread.InitComponent;
begin
inherited;
FThreadPriority := tpNormal;
FMaxThreads := 0;
end;
{ TIdYarnOfThread }
constructor TIdYarnOfThread.Create(
AScheduler: TIdScheduler;
AThread: TIdThreadWithTask
);
begin
inherited Create;
FScheduler := AScheduler;
FThread := AThread;
AThread.Yarn := Self;
end;
destructor TIdYarnOfThread.Destroy;
begin
FScheduler.ReleaseYarn(Self);
inherited;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -