在Delphi中如果一个新的线程对象要访问主窗体(比如要在主窗体的某个Edit控件中显示一个字符串)时,需要使用Synchronize方法,否则程序会崩溃。  但为什么在MIDAS的应用程序服务器的远程数据模块(每个远程数据模块在不同的Apartment线程)中访问主窗体时,不需要同步呢?  难道主窗体也是一个COM对象,主线程是Apartment线程,远程数据模块对主窗体的访问由主线程进行同步吗?

解决方案 »

  1.   

    还有个问题,如果在远程数据模块的Create事件中写了访问主窗体的代码(比如  MainForm.Edit1.Text := 'test!'),当客户端连接到应用程序服务器时,会使应用程序服务器失去响应,就像是进入了死循环,但没出现任何错误消息! 不知是什么问题??
      

  2.   

    学习,关于第二个问题,是不是出了错?可以开两个delphi跟踪一下。我觉得第一个问题是不是因为一个远程服务就是一个进程,也就是说如果有两个客户的话,在系统中虽然只有一个远程服务的应用程序,但是却有两个进程?可以看一看是不是这样。
      

  3.   

    To idilent:  我的RemoteDataModule的设置为MultiInstance、Apartment。每一个客户对应一个Apartment线程,不是对应一个进程。关于第二个问题,从逻辑和语法上应该没有错。我调试时跟踪发现,好像程序一直死在线程的消息循环中了,不知道为什么?
      

  4.   

    ""
    我试了一下,远程数据模块不能静态创建。而且即使能静态创建,那也没什么意义呀!""
    在delphi得Project->Option-->Forms中把远程数据模块从Avialable Forms调制为AutoCreate.因为,当一个客户端连接是,如果服务器启动时先创建得是远程数据模块,而不是主窗体,所以你得代码会出错.