用Remote Data Module做数据模块时怎么捕捉连接到服务器的客户端数量?我在窗体里定义了一个函数和一个全局变量
iClient:Integer;procedure TForm1.UpdateClient(Inc:Integer);
begin
  iClient:=iClient+Inc
  Label2.Caption:=IntToStr(Inc);
end;Data Module的Create事件里调用了这个函数
...
implementation
uses Unit1;
...
procedure TSERVER.RemoteDataModuleCreate(Sender: TObject);
begin
  Form1.UpdateClient(1);
end;服务器会死掉,这是怎么回事。
而且把这两段代码去掉就能正常运行。
请高手指教

解决方案 »

  1.   

    远程模块和窗体不是运行在同一线程内,所有你这样调用是错误的!
    应该使用一个全局变量g_count来记录,
    在OnCreate事件里,InterlockedIncrement(g_count)
    在OnDestroy事件里, InterlockedDecrement(g_count)
    然后可以在application的idle事件里处理g_count
      

  2.   

    请教一下 billy_zh(牛仔) 
    '然后可以在application的idle事件里处理g_count'
    application的idle事件在哪里找
      

  3.   

    应该使用一个全局变量g_count来记录,
    在OnCreate事件里,g_count+1
    在OnDestroy事件里,g_count-1
      

  4.   

    我如果想定义全局变量,怎么在Project里定义全局变量,什么位置,什么格式,什么关键字type、var?
      

  5.   

    用var定义,可以在一个新单元里建立,然后在主窗体和远程模块内uses这个单元。
    建议楼主看一个delphi5/6的开发指南!
      

  6.   

    调用其他单元里的变量我试过,可行,但我怎么刷新这个LABEL控件呢?
    那我用Timer控件来不停的检测这个全局变量么,
    还是有别的方法来动态实时刷新这个记数变量。
      

  7.   

    implementation
    uses Unit1;
    var
      LockCount:TMultiReadExclusiveWriteSynchronizer;
    ...
    procedure TSERVER.RemoteDataModuleCreate(Sender: TObject);
    begin
      LockCount.BeginWrite;
      Form1.UpdateClient(1);
      LockCount.EndWrite;
    end;
    initialization
       LockCount:=TMultiReadExclusiveWriteSynchronizer.Create;
    finalization
      LockCount.Free;
      

  8.   

    晕,写这么多代码干嘛,ComServer.ObjectCount就得到了。ComServer是一个TCOmServer类型的全局变量,Delphi自动维护。
      

  9.   

    Miracle(秋水长天) 高人也! 分给他吧。
    再请教,如何得到连接的客户端名称呢?
      

  10.   

    这个不好太办,要深入到操作系统内部了,尤其是有socketserver、webconnection等等进行代理的情况下,几乎没法知道客户的真实身份
      

  11.   

    Miracle(秋水长天):
    还有一个问题,如果我想知道连接到每个 RemoteDataModule 的连接数,有办法吗?
      

  12.   

    我认为基本上不太可能获得逻辑上的连接数量,因为此连结数并非由RemoteDataModule本身决定,而是取决于外部条件。不过获取其接口的ReferenceCount或许会有帮助。个人意见,仅供参考