关于服务器端COM对象如何使用多线程的方式调用另一个COM对象的服务?请诸位帮忙!特别邀请menxin、xeen、coolzew、Sachow等大侠请来指点。(

  • 主题发起人 主题发起人 siyan
  • 开始时间 开始时间
有点晕了,我的服务器是exe型的,程序一运行就创建服务线程
那也得先创建COM对象吧,创建之后是调用方法进入循环还是在创建事件里就进入循环?
退出的时候要释放对象,释放前要停掉循环,那在什么地方把bcontinue设为false?
 
to xeen
如何在程序一执行就创建一个服务线程?
 
to xeen 看一下我的处理行不行,下面是主要的代码,不知道是否达到你所说的
程序一运行就创建一个服务线程的效果
TSetControlThread = class (TThread)
protected
procedure Execute;override;
end;
var
hMutex:THandle;
myThread : TSetControlThread;
procedure TSetControlThread.Execute;
begin
mySetCOntrol:=TSetControl.Create(nil) ;
while not myThread.Terminateddo
begin
if WaitForSingleObject(hMutex,INFINITE)= wait_object_0 then
begin
if mySetCOntrol.GetQueueInfo then
begin
ReleaseMutex(hMutex);
mySetCOntrol.MatchingData(mySetControl.cdsInner.Data,mySetControl.CurMessage);
end
else
ReleaseMutex(hMutex);
end ;
end;
MySetControl.Free;
end;

initialization
TComponentFactory.Create(ComServer, TSetControl,
Class_SetControl, ciMultiInstance, tmApartment);
hMutex:=CreateMutex(nil,false,nil);
myThread:=TSetControlThread.Create(False);
finalization
myThread.Terminate;
Closehandle(hMutex);
 
你的情况是:客户端要调用组件A的方法A_1,A_1在向数据库保存数据后进行一系列比对,这些比对要耗时10分钟,为了不想让客户端在10分钟之内都不响应,你就想在方法A_1中再建立一个线程用来执行比对工作,以希望此方法能够尽快返回,从而使客户端能尽快响应。是这样吗?
还要考虑一下以下几个方面:1、对比工作没有必要实时完成?如果没必要的话,放在另一时间来处理行吗(比如说采用日结的方式),如果有必须的话,客户端就只能等待所有工作的完成(在STA线程模型下,一个客户端进程在等待时,另一个进程仍可以获取服务),这样就应该考虑一下是不是有别的方法可以减短比对的时候(比如说改良库表结构和算法)。
 
to siyan:差不多就是这意思.
不过结束线程的代码要改改
myThread.Terminate;
if WaitForSingleObject(myThread.handle,INFINITE)= wait_object_0 then
//保证线程结束
Closehandle(hMutex);
不过这样不能保证你对列里的所有成员都得到了处理,可能没处理完程序就结束了。
 
那把 while not myThread.Terminateddo
改成while (not myThread.Terminated) and (队列为空)do
是否就行了呢
令我不爽的是,这样写就变成了普通的多线程应用程序,于COM扯不上什么关系
难道COM的机制里就没有可以简单实现对另一对象服务的多线程调用的方法吗?
 
改成while (not myThread.Terminated) and (队列为空)do
是否就行了
----------------------------------------------------------------
应该是这样,不过你在结束程序的时候应该设置个标志使队列不再增加新成员了,
否则程序可能总也结束不了.
难道COM的机制里就没有可以简单实现对另一对象服务的多线程调用的方法吗?
----------------------------------------------------------------------
好象没有什么"多线程调用",事实上实现Com的线程也是一个消息循环,调用其接口
上方法就是通过代理向对象发消息.
 
to sachow
不是10分钟是10秒钟,我个人觉得已经很优化了,中间过程至少需要执行4次SQl语句
这样的速度不算慢吧
to xeen
这个问题已经解决,谢谢你,不过http://www.delphibbs.com/delphibbs/dispq.asp?lid=1940274
这个问题是否也就此解决还有待测试,有时间的话请继续关注
BTW:前面的where语句写错了,应该是while (not myThread.Terminated) or (队列不为空)do
吧,这样才能保证队列能操作完
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部