快死啦!如何释放ComObject在OleAutomation Server (100分)

  • 主题发起人 主题发起人 yuhung
  • 开始时间 开始时间
Y

yuhung

Unregistered / Unconfirmed
GUEST, unregistred user!
有二支程式
SerVer 端有 MainForm及OleAutomation Server是由
TAutoObjectFactory.Create...创建
Client 端透过MidasConnation 连至AP Server
在正常程序下,ComObject 能够正确的释放!

请教! 若想在SerVer作释放该COMobject的处理机制(Button Click)
该如何做?
 
呵呵, 用
server.free;
server:=nil;
来释放.

 
这样释放ComServer是不是会弹出那个对话框? 我记得ComServer里面保存了
一个类和接口的计数. 如果非要强制释放, 可能需要清空这两个数.
 
没错!Cmxu说的没错!我不是要释放所有的Comobject,只是要释放所指定的Client
端所占的Resource及ComObject!

Cmxu 可否说的再详细!
 
还没释放玩。
用Cytown的不太好,
但也挺好的。
(自相矛盾。。。)
 
怎麽了!没人会吗!
 
到底有没有会呀!呀!呀!......(回音)
贴了好久!,都没有较具体的答案。

如分数不够,在加 200 分
但最好详细一些!
就所知可以使用 Codisconnectobject
可否有人解释一下!
或 有其他更好的方法!
 
不好意思, 偶在苏州出差,这里上网慢的要命, 这个月几乎没上来几次.

提供一点思路:

unit MyComServer;

interface

uses ComObj, ComServ;

TMyComserver = class(TComServer)
private

public
function CountObject(Created: Boolean): Integer; override;
function CountFactory(Created: Boolean): Integer; override;
end;

var
MyComServer: TMyComServer;

implememtation

function TMyComserver.CountObject(Created: Boolean): Integer;
begin
Result := Inherited CountObject(Created);
end;

function TMyComserver.CountFactory(Created: Boolean): Integer;
begin
Result := Inherited CountFactory(Created);
end;

initialization
begin
MyComServer := TMyComServer.Create;
end;

finalization
begin
MyComServer.Free; //注意: 这里可能需要作一些处理
end;

///////////////////////////////////////////////////////////////////////////////////
// 在你的服务器单元里 把原来的ComServer替换掉, 但是保留对它的Uses
//
///////////////////////////////////////////////////////////////////////////////////
/////////////////
TAutoObjectFactory.Create(MyComServer, TYourServerApp, YourCalssID, ciSingleInstance);


.....
TYourServer.Button1Click(Sender: TObject);
begin
//This only count object to 0;
while MyComServer.CountObject(False)>0 do
;

while MyComObject.CountFactory(False)>0 do
;

//You need trace TAutoObject create, and store all auto object in some place.
//and free them here. OR some thing unexpected maybe happened.
end;


 
我的 APserver 是使用 Delphi4 CD 内附的 Multi-thread 机制(demos/midas/)
也可以做到吗!

如果我要将指定的 Comobject 释放,有没有办法做到。

另外 主 process 要 SendMessage 给 RemotedataModule 要如何做到?
 
好像直接对ComObject付值nil就行了,其它的Delphi替你做了.
如果先调用.Free再:=nil,可能会有异常.
 
不知你所说的指定是用什么来指定? 一般就编程来说,
客户端的联结对程序是透明的. 也就是缺省情况下,
你无法区分两个客户. 如果想区分恐怕需要另加一些
方法才行. 如果你担心客户端异常退出对服务器造成
损害, 大可不必: DCOM低层有一套PING协议, 在失去
联结6分钟后服务器会自动释放.



(这里是本人的一些浅见, 不敢确定. 如有错误之处,敬请指出)
 
cmxu所言极是。如果真想让SERVER知道的话,不如
加两个方法INIT, EXIT为好。客户
调用他们来注册。
 
我对这样的问题是这样处理的:
1、Server端上用Datamodule来产生所需的数据处理
2、Client端用一个方法刷新Server上的对这个Client的计数器。
3、Server监视计数器,发现Client死了,就把Datamodule释放掉,至于ComServer
我并不关心它,在我看来,只有我写的数据处理部分占用大量资源,而Client与
ComServer建立的联结所占用的资源似乎不多。

这问题很严重,如果写一个7x24的服务器,不正常关机的Client会对ComServer产生
什么影响?会整死服务器吗?

现计现策啊,我都快累死了。
 
在Server端当然可以强行释放ComObject, 释放的方法是 Server := nil;

但是,这样简单的释放在Client端会造成错误,所以不建议这样强行释放. 比较安全的做法是:

1. 给Server加上一个事件,通知Client我需要你马上停止这个Object;
2. Client接到通知后,等待正在进行的事情结束以后,释放全部的连接;

这样虽然比较麻烦,服务器端必须知道要释放的Client,才能给这个Client发送通知. 但是服务
程序是应该对客户程序负责任的.

 
在服务器端强行断掉客户并没有什么错,至于弹出来的提示可以通过处理ComServer的
事件禁止掉。现在的关键问题是需要释放什么资源(实例?线程?),这与服务器的
实例化策略和线程模型有关。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部