如何在三层结构中,随时按取消中断占时比较长的远程调用(200分)

  • 主题发起人 delphiB/S
  • 开始时间
问题太广了一点。情形太多,如果都写出来可以是一本书;
 
ado中好象可以通过设为异步方式来实现
 
你应该写一单独的线程来执行这个远程调用,
在取消的时候,结束该线程,不知可不可行?
 
如果这个调用是系统管理的(如RPC),我想很难把它杀了。
如果这个进程是你自己的,你可以在这个进程中自己设定超时,超过了就自杀。
......
对这个问题我不太了解,瞎说一通了。
 
这个我觉得还是比较好办的,你可以使用一个 计时器 Timer , 再在程序中设定一个 UserCancel
的Boolean变量, 在Cancel的时候将UserCancel设为True ,Timer的作用是根据你设定的 计时时间
(比如:每秒检查一次UserCancel的值,为True,则可以进行你想要的操作!
我在写FTP线程程序时用到此法,当FTP线程下载一个GB级的大文件时,使用此法可以自由的中断FTP
连接,且不出错!
 
可是关键是它在执行的时候不响应任何事件呀,只有在客户端创建个线程来调用,可是我试
了通不过,我也正好在做一个程序跟DELPHIB/S的问题差不多
 
关注~~~~~~
 
没有人回答这个问题吗
 
可以把服务端的那个过程,放在一个线程中执行,然后客户端调用是先启动那个
线程,然后立即返回,接下来客户端不停地查询:“服务啊,你那个线程完成了
吗?”如果完成,直接去取结果。如果用户按下“取消”,则通知“服务啊,你
那个计划被CANCEL掉了,我不要了,你中止它吧”。然后返回,至于服务能不能
中止,不关我事了。
注意:如果那个线程无法CANCEL(如存储过程),则即使不是远程调用也是无法
CANCEL的。
 
嗯,服务端一听,火冒三丈,强制中止线程。
 
delphiB/S 提到
比如在INTERNET上,。。。远程调用返回参数就很慢,这个时候,取消远程调用就很必然。
请问是Socket调用吗?
如果是,那你必须等Socket TimeOut

 
procedure TForm1.Button1OnClick;
var
E: Exception;
begin
E := Exception.Create('取消操作');
SendMessage(SocketConnection1.Handle, THREAD_EXCEPTION, 0, Integer(Pointer(E)));
// PostMessage(SocketConnection1.Handle, THREAD_EXCEPTION, 0, Integer(Pointer(E)));
end;
 
我说的是TSocketConnection,其它的不知。
不过必须要在一个线程中建立来创建一个TSocketConnection,不然你连ButtononClick的事件
了触发不了。因为你调用后,TStreamedConnection的一个线程一直GetMessage循环,根据不让
其它线程进入,所以建立一个线程吧。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
963
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部