这问题难道没人能回答?!
通常在长时间处理过程中,我们可以定期地调用Application.ProcessMessages来实现
界面刷新,但现在我遇到一个问题:在三层结构中,客户端程序依次调用异地DCOM服务器上的一系列函数,而这些函数的处理时间均比较长,我不知该如何处理客户端界面的刷新,在此特向各位大虾求教。
问题点数:50、回复次数:9Top
1 楼c1005(陈一蛟)回复于 2000-09-07 09:58:00 得分 5
你只需要在COM Server 上的方法中的相应的位置上加上Application.ProcessMessages;语句就能够如何处理客户端界面的刷新Top
2 楼playpcgame(修罗王)回复于 2000-09-07 09:58:00 得分 0
见服务器端的函数进行分拆,减少执行时间Top
3 楼playpcgame(修罗王)回复于 2000-09-07 09:58:00 得分 5
将服务器端的函数进行分拆,减少执行时间Top
4 楼Barbarian(野蛮人)回复于 2000-09-07 11:08:00 得分 0
很感激playpcgame和c1005两位的回答,但在DCOM server上执行Application.ProcessMessages的方法我也曾试过,好像只能处理服务器本身的刷新,对客户端的刷新却无能为力,至于将服务器端的函数分拆固然是个不错的主意,但对我却无多大意义,因为
我这里的具体处理流程是这样的:客户端从本地局域网上的数据库服务器上取得若干数据集,然后将每个数据集分别以data的形式发送给异地应用服务器,应用服务器再将收到的data进行处理,即取出data中的每条记录,将记录的每个字段读出,作为参数传递给另一数据库服务器上的存储过程,然后执行存储过程.这个流程如果一变,将给我增加很多工作量,因此不到万不得已是不会
去改变这基本流程的。Top
5 楼Sayhigh(fuck)回复于 2000-09-07 14:51:00 得分 5
用线程处理.Top
6 楼JGTM2000(铁马小子)回复于 2000-09-08 00:37:00 得分 5
Sayhigh is all right. Use a UI thread to handle such situation. Be careful to match the threading model of the COM components you are calling, or you will get serious performance trouble.Top
7 楼iforever(iforever)回复于 2000-09-08 09:33:00 得分 5
我不知道你说的那些和客户端刷新有什么联系.
你做的这些事我也做过.
把你的刷新任务讲清楚些.
你的问题并没有讲清楚
是需要定期实时刷新速度太满.
还是手工刷新太慢
Top
8 楼c1005(陈一蛟)回复于 2000-09-08 11:06:00 得分 25
会不会使用COM 的 Callback 编程模式,如果会的话,可在应用服务器再将收到的data进行处理,即取出data中的每条记录,将记录的每个字段读出,作为参数传递给另一数据库服务器上的存储过程,然后执行存储过程时这段业务过程中加上相应调用回调方法,在回调方法应有Application.ProcessMessages语句,这样就可以将应用服务器的处理进度反馈给客户端,且Application.ProcessMessages语句的目的就是处理客户端界面的刷新。
Callback 编程方法就是在应用服务器上新增一个接口,在定义相应的方法,然后在客户端采用接口对象的方式实现此接口,例如:
客户端:
TClientCallback = class(TAutoIntfObject, IClientCallback(应用服务器上的接口))
protected
procedure Progress(param1: 类型); safecall;
end;
procedure TFrmClient.FormCreate(Sender: TObject);
var
typelib: ITypeLib;
begin
OleCheck(LoadRegTypeLib(LIBID_CallbackServer, 1, 0, 0, typelib));
FClientCallback := TClientCallback.Create(typelib, IClientCallback);
end;
procedure TFrmClient。BtnServerClient(Sender: TObject);
begin
MDCOMConnection1.AppServer.Refresh(FClientCallback);
end;
Server 端:
procedure TServer.Refresh(FClientCallback :OleVariant);
begin
OleVariant(IDispatch(FClientCallback)).Progress(参数);
...
end;Top
9 楼tms2000(海天)回复于 2000-09-13 17:08:00 得分 0
old=Now;
Repeat
Application.ProcessMessages;
Until Now>Old+Num* 1/24/60/60
Top




