你用的是MIDAS的ScktSrvr和TSocketConnection不?
修改ScktSrvr.dpr->ScktMain.pas
client的意外断开,Server不能侦听到中断,以致一直block 一个clientThread,我试过可以通过PostThreadMessage(Thread.ThreadId, WM_USER, 0, 0),发一个消息给线程,在ClientThread因为它是创建了一个消息队列,并且它的MsgWaitForMutipleObjects是可以侦听到消息,所以你可以稍微修改一下server的源码,加一些小处理就可以了。
server加一下TTimer,时间为60000ms,一分钟吧先,每分钟,server去postThreadMessage给每个ClientThread,然后在
RefreshClientTimer是一个TTimer, interval=60000(一分钟)
procedure TSocketForm.RefreshClientTimeTimer(Sender: TObject);
var
I: Integer;
Thread: TSocketDispatcherThread;
begin
RefreshClientTime.Enabled := False;
try
for I := 0 to ConnectionList.Items.Count - 1do
begin
Thread := TSocketDispatcherThread(ConnectionList.Items.Item.Data);
PostThreadMessage(Thread.ThreadID, WM_USER, 0, 0);
end;
finally
RefreshClientTime.Enabled := True;
end;
end;
ClientExceute中:
//在这个case中
WAIT_OBJECT_0 + 1:
begin
while PeekMessage(msg, 0, 0, 0)do
...
if 得到当前时间 - 客户端程序最后响应时间 > 某个时间(自己设) then
ClientSocket.Connected := False//就断开它。
end;
其它的相同吧。
如果是其它DCOM,可以在MainForm中用一个TStrings得到客户端的RDM最后响应时间,可能比较
麻烦,就是在RDM中在每个方法中加入UpdateLastReponseTime,记录最后响应时间。然后MainForm
也加入一个TTimer像上面的做法一样。
不知行不行,我只是用过TSocketConnection,其它的没怎么用。