作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在设置TCP Client / Server系统时,我将TIdServerContext
子类化以添加索引标志,但是似乎没有OnWork
事件。我需要重置一个计时器,比如说在上传/下载大文件时,很多Indy组件都有一个OnWork
事件用于此操作,但我找不到用于TIdServerContext
或TIdTCPServer
的事件,根据其他帖子,TIdTCPServer.OnStatus
事件似乎未实现。
这是我实现TIdServerContext
的方法:
TUserContext = Class(TIdServerContext)
Protected
FUserID: Integer;
Public
Property UserID: Integer Read FUserID Write FUserID Default 0;
End;
Procedure FormCreate(Sender: TObject);
Begin
Server.ContextClass := TUserContext;
End;
Procedure ServerExecute(AContext: TIdContext);
Var
I: Integer;
Begin
I := TUserContext(AContext).UserID;
...
End;
最佳答案
OnWork...
事件在TIdComponent
类中,而TIdServerContext
并非此类来源。但是,TIdTCPConnection
和TIdIOHandler
可以。 TIdContext
具有公共的Connection
属性,因此在服务器的事件(OnConnect
,OnExecute
等)中,可以根据需要将处理程序分配给TIdConnection.OnWork...
事件:
procedure TMyForm.ServerConnect(AContext: TIdContext);
begin
AContext.Connection.Tag := NativeInt(AContext);
AContext.Connection.OnWork := WorkHandler;
end;
procedure TMyForm.WorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
Ctx: TUserContext;
begin
Ctx := TUserContext(TIdTCPConnection(ASender).Tag);
// use Ctx members as needed...
end;
AContext
即可将
WorkHandler
传递给
Tag
的方法:
procedure TMyForm.ServerConnect(AContext: TIdContext);
var
Handler: TWorkEvent;
begin
Handler := WorkHandler;
TMethod(Handler).Data := AContext;
AContext.Connection.OnWork := Handler;
end;
procedure TMyForm.WorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
var
Ctx: TUserContext;
begin
Ctx := TUserContext(Self);
// use Ctx members as needed...
end;
TIdServerContext
构造函数,该构造函数接收
TIdTCPConnection
对象作为参数。您可以使处理程序成为
TUserContext
类本身的方法,并让其构造函数立即分配
OnWork...
事件,而不是等待服务器的
On(Connect|OnExecute)
事件首先触发:
type
TUserContext = Class(TIdServerContext)
protected
FUserID: Integer;
procedure WorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
public
constructor Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TIdContextThreadList = nil); override;
property UserID: Integer read FUserID write FUserID;
end;
constructor TUserContext.Create(AConnection: TIdTCPConnection; AYarn: TIdYarn; AList: TIdContextThreadList = nil);
begin
inherited;
AConnection.OnWork := WorkHandler;
end;
procedure TUserContext.WorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
// use Self members as needed...
end;
type
TUserContext = Class(TIdServerContext)
protected
FUserID: Integer;
procedure WorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
public
procedure StartWorkTimer;
procedure StopWorkTimer;
property UserID: Integer read FUserID write FUserID;
end;
procedure TUserContext.StartWorkTimer;
begin
Connection.OnWork := WorkHandler;
end;
procedure TUserContext.StopWorkTimer;
begin
Connection.OnWork := nil;
end;
procedure TMyForm.ServerExecute(AContext: TIdContext);
var
Ctx: TUserContext;
begin
Ctx := TUserContext(AContext);
...
if (some condition) then
Ctx.StartWorkTimer;
...
if (some other condition) then
Ctx.StopWorkTimer;
...
end;
关于delphi - 使用Delphi和Indy 10.6,我找不到TIdServerContext的OnWork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902374/
在设置我的 TCP 客户端/服务器系统时,我对 TIdServerContext 进行了子类化以添加索引标志,但似乎没有 OnWork 事件。我需要重置计时器,例如在上传/下载大文件时,许多 Indy
我是一名优秀的程序员,十分优秀!