我给一个解决方案:
A方案:
1:在RDM的OnCreate中把Name,创建时间和Self放到一个TstringList中去。
2:Client链接时,把Client的IP送过来。
3;在MainForm中起一个Thread,去检测TstringList中的Object列表。如果
发现某个对象的创建已经超过规定的时间(如:1小时),就执行死亡检测
简单点就是Ping。如果OK更新TStringLIst中的时间,如果NO就释放;
可用入下代码:
CoDisconnectObject(TRDMList(TstringList.Items.Objects[SelIndex]).ComObject, 0);
(这是 Dan Miser 也就是Midas主开发人给出Demo,如果要我可以发给你)
但我的试验好像不行,
所以我用:
TRDMList(TstringList.Items.Objects[SelIndex]).Free
B.在Scktsrvr中设置Timeout。由以下的代码可见,是能够释放服务资源的,
我也试验过
ScktMain.pas
........................................
procedure TSocketDispatcherThread.ClientExecute;
............................
if FTimeout = 0 then
WaitTime := INFINITE else
WaitTime := 60000;
while not Terminated and FTransport.Connecteddo
try
case MsgWaitForMultipleObjects(1, Event, False, WaitTime, QS_ALLEVENTS) of
WAIT_OBJECT_0:
begin
WSAResetEvent(Event);
Data := FTransport.Receive(False, 0);
if Assigned(Data) then
begin
FLastActivity := Now;
FInterpreter.InterpretData(Data);
Data := nil;
FLastActivity := Now;
end;
end;
WAIT_OBJECT_0 + 1:
while PeekMessage(msg, 0, 0, 0, PM_REMOVE)do
DispatchMessage(msg);
WAIT_TIMEOUT:
if (FTimeout > 0) and ((Now - FLastActivity) > FTimeout) then
FTransport.Connected := False;
end;
祝你好运![
][
][8D][8D]