Blue
Red
Green
Orange
Voilet
Slate
Dark

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

  • 主题发起人 delphiB/S
  • 开始时间
T

Tense

Unregistered / Unconfirmed
GUEST, unregistred user!
问题太广了一点。情形太多,如果都写出来可以是一本书;
 
Y

yangkee

Unregistered / Unconfirmed
GUEST, unregistred user!
ado中好象可以通过设为异步方式来实现
 
N

nsj

Unregistered / Unconfirmed
GUEST, unregistred user!
你应该写一单独的线程来执行这个远程调用,
在取消的时候,结束该线程,不知可不可行?
 
T

txmaster

Unregistered / Unconfirmed
GUEST, unregistred user!
如果这个调用是系统管理的(如RPC),我想很难把它杀了。
如果这个进程是你自己的,你可以在这个进程中自己设定超时,超过了就自杀。
......
对这个问题我不太了解,瞎说一通了。
 
W

wangease

Unregistered / Unconfirmed
GUEST, unregistred user!
这个我觉得还是比较好办的,你可以使用一个 计时器 Timer , 再在程序中设定一个 UserCancel
的Boolean变量, 在Cancel的时候将UserCancel设为True ,Timer的作用是根据你设定的 计时时间
(比如:每秒检查一次UserCancel的值,为True,则可以进行你想要的操作!
我在写FTP线程程序时用到此法,当FTP线程下载一个GB级的大文件时,使用此法可以自由的中断FTP
连接,且不出错!
 
J

jayxsjf

Unregistered / Unconfirmed
GUEST, unregistred user!
可是关键是它在执行的时候不响应任何事件呀,只有在客户端创建个线程来调用,可是我试
了通不过,我也正好在做一个程序跟DELPHIB/S的问题差不多
 
B

blackfiles

Unregistered / Unconfirmed
GUEST, unregistred user!
关注~~~~~~
 
J

jayxsjf

Unregistered / Unconfirmed
GUEST, unregistred user!
没有人回答这个问题吗
 
H

Huzzz

Unregistered / Unconfirmed
GUEST, unregistred user!
可以把服务端的那个过程,放在一个线程中执行,然后客户端调用是先启动那个
线程,然后立即返回,接下来客户端不停地查询:“服务啊,你那个线程完成了
吗?”如果完成,直接去取结果。如果用户按下“取消”,则通知“服务啊,你
那个计划被CANCEL掉了,我不要了,你中止它吧”。然后返回,至于服务能不能
中止,不关我事了。
注意:如果那个线程无法CANCEL(如存储过程),则即使不是远程调用也是无法
CANCEL的。
 
H

Huzzz

Unregistered / Unconfirmed
GUEST, unregistred user!
嗯,服务端一听,火冒三丈,强制中止线程。
 
T

TeaTeaTTT

Unregistered / Unconfirmed
GUEST, unregistred user!
delphiB/S 提到
比如在INTERNET上,。。。远程调用返回参数就很慢,这个时候,取消远程调用就很必然。
请问是Socket调用吗?
如果是,那你必须等Socket TimeOut

 
C

copy_paste

Unregistered / Unconfirmed
GUEST, unregistred user!
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;
 
C

copy_paste

Unregistered / Unconfirmed
GUEST, unregistred user!
我说的是TSocketConnection,其它的不知。
不过必须要在一个线程中建立来创建一个TSocketConnection,不然你连ButtononClick的事件
了触发不了。因为你调用后,TStreamedConnection的一个线程一直GetMessage循环,根据不让
其它线程进入,所以建立一个线程吧。
 

Similar threads

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