【问题标题】:AContext.data can be nil?AContext.data 可以为零吗?
【发布时间】:2012-11-26 03:09:23
【问题描述】:

在这段代码中,正如您在 Connect 上看到的那样,AContext.Data 填充了一些东西

TmyTThreadList = class(TThreadList)
  id: integer;
end;

var unique_id:integer;

procedure TfrmTestIdTCPServer.IdTCPServerConnect(AContext: TIdContext);
 begin
  CS.Enter;
  try
    inc(unique_id);
  finally
    CS.Leave;
  end;

   AContext.Data := myTThreadList.Create;
   list := myTThreadList(AContext.Data).LockList;
   try
     myTThreadList(AContext.Data).id := my_unique_id;
     list.Add(myTThreadList(AContext.Data));
   finally
     myTThreadList(AContext.Data).UnlockList;
   end;
 end;

然后在断开连接时,编码器在此处检查 Acontext.Data nil

procedure TfrmTestIdTCPServer.IdTCPServerDisconnect(AContext: TIdContext);
 var
 begin
   if AContext.Data <> nil then
   begin

问题是,他为什么要检查 nil ?

谢谢。

编辑:

我问这个,因为当我这样做时,我在 onExecute 访问 AContext.Data ,有时(当同时连接许多客户端时) AContext.Data 为空,出现访问冲突。

【问题讨论】:

  • 旁白:为简单起见,不需要关键部分。对全局 ID 使用 InterlockedIncrement。

标签: delphi indy delphi-xe3


【解决方案1】:

最初的程序员可以出于多种不同的原因检查 Data 是否为 nil,真正知道这一点的唯一方法是问他/她为什么这样做。

我认为可能是:

  • 即使为任何连接创建了新的 Data 对象,出于任何其他数量或原因,该对象可以在连接的生命周期内被释放。例如,由于存储在那里的数据或来自客户端或其他外部源的请求,在该服务器组件的 OnExecute 事件处理程序中。
  • 可能在连接的生命周期内要执行的代码超出了原始程序员的控制,因此他/她没有其他方法可以知道 Data 对象是否仍然存在,例如组件编写者应该进行这种测试,或者库程序员应该在团队中工作。
  • 最初的编码员只是那种防御性程序员,即使他/她知道 Data 对象应该在那里,也会应用检查,但只是为了确保它存在并防止意外访问冲突。

就您而言,AFAIK,Indy 不会触及 Data 对象,而是在 Task 实例的 Destroy 序列中。

TIdTask.Data 文档指出:

用户指定的对象,其值在任务执行期间使用。 Data 是一个 TObject 属性,表示用户指定的对象实例,其值可在任务执行期间使用。

在 Create 中创建任务后,必须将对象实例分配给 Data。

Data 属性归 TIdTask 实例所有,将在 Destroy 中释放。

并且没有提及 Indy 本身释放数据的任何情况。

我做了一个测试,将一个对象分配给一个新的连接,在服务器上做一些工作并从客户端做多个连接,在数千个连接之后,没有人未能保持正确的 Data 对象附加到每次调用中的AContext,不仅对OnDisconnect而且对OnExecute事件。

【讨论】:

    【解决方案2】:

    如果OnConnect 事件处理程序中发生未捕获的异常,仍然可以调用OnDisconnect 事件。如果TThreadList.Create 引发异常,则不会分配AContext.Data

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2015-07-24
      相关资源
      最近更新 更多