📄 idscheduleroffiber.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: 56076: IdSchedulerOfFiber.pas
{
Rev 1.2 6/11/2004 8:40:06 AM DSiders
Added "Do not Localize" comments.
}
{
{ Rev 1.1 2004.02.09 9:16:48 PM czhower
{ Updated to compile and match lib changes.
}
{
{ Rev 1.0 2004.02.03 12:38:58 AM czhower
{ Move
}
{
{ Rev 1.9 2003.10.24 1:00:06 PM czhower
{ Name change
}
{
{ Rev 1.8 2003.10.21 12:19:20 AM czhower
{ TIdTask support and fiber bug fixes.
}
{
{ Rev 1.7 2003.10.19 4:38:34 PM czhower
{ Updates
}
{
{ Rev 1.6 2003.10.19 2:50:40 PM czhower
{ Fiber cleanup
}
{
{ Rev 1.5 2003.10.19 1:04:28 PM czhower
{ Updates
}
{
{ Rev 1.4 2003.10.14 11:17:06 PM czhower
{ Updates to match core changes.
}
{
{ Rev 1.3 2003.10.11 5:43:48 PM czhower
{ Chained servers now functional.
}
{
{ Rev 1.2 2003.09.19 10:09:42 PM czhower
{ Next stage of fiber support in servers.
}
unit IdSchedulerOfFiber;
interface
uses
Classes,
IdFiberWeaver, IdTask, IdFiber, IdScheduler, IdYarn;
type
TIdSchedulerOfFiber = class;
TIdYarnOfFiber = class(TIdYarn)
protected
FFiber: TIdFiberWithTask;
FScheduler: TIdScheduler;
public
constructor Create(
AScheduler: TIdScheduler;
AFiber: TIdFiberWithTask
); reintroduce; virtual;
destructor Destroy;
override;
//
property Fiber: TIdFiberWithTask read FFiber;
end;
TIdSchedulerOfFiber = class(TIdScheduler)
protected
FFiberWeaver: TIdFiberWeaver;
public
function AcquireYarn
: TIdYarn;
override;
procedure StartYarn(
AYarn: TIdYarn;
ATask: TIdTask
); override;
procedure TerminateYarn(
AYarn: TIdYarn
); override;
published
//TODO: Need to add notification for this prop
//TODO: Dont allow setting while active
property FiberWeaver: TIdFiberWeaver read FFiberWeaver write FFiberWeaver;
end;
implementation
uses
IdGlobal,
SysUtils;
{ TIdSchedulerOfFiber }
function TIdSchedulerOfFiber.AcquireYarn: TIdYarn;
var
LFiber: TIdFiberWithTask;
begin
LFiber := TIdFiberWithTask.Create(nil, nil, Format('%s User', [Name])); {do not localize}
Result := TIdYarnOfFiber.Create(Self, LFiber);
ActiveYarns.Add(Result);
end;
procedure TIdSchedulerOfFiber.StartYarn(
AYarn: TIdYarn;
ATask: TIdTask
);
begin
inherited;
TIdYarnOfFiber(AYarn).Fiber.Task := ATask;
// Last - Put it in the queue to be scheduled
FiberWeaver.Add(TIdYarnOfFiber(AYarn).Fiber);
end;
procedure TIdSchedulerOfFiber.TerminateYarn(AYarn: TIdYarn);
begin
// Fibers dont "run", so we dont terminate them
FreeAndNil(AYarn);
end;
{ TIdYarnOfFiber }
constructor TIdYarnOfFiber.Create(
AScheduler: TIdScheduler;
AFiber: TIdFiberWithTask
);
begin
inherited Create;
FScheduler := AScheduler;
FFiber := AFiber;
AFiber.Yarn := Self;
end;
destructor TIdYarnOfFiber.Destroy;
begin
FScheduler.ReleaseYarn(Self);
inherited;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -