高手指点:DCOM应用服务器如何显示现在连接客户的信息?(200分)

W

wbo

Unregistered / Unconfirmed
GUEST, unregistred user!
三层结构,DCOM方式连接,远程数据模块的实例和线程参数为Multiple Instance和Apartment,
打算在应用服务器的主窗口上显示当前客户的姓名和总人数
(类似Delphi6/Demos/Midas/Login/server.dpr)。
在DCOMCNFG.EXE中设置身份标识属性:
1.交互式用户:如果服务器计算机未登录,则客户无法连接;
2.启动用户:每个客户启动一个程序实体,主窗口上只能看到本机的客户;
3.指定用户:主窗口根本无法显示。
所以都达不到目的。改变方法,专门建立一个监视程序,用来显示所需信息,
当客户登录/注销时,由应用服务器向监视程序postmessage(...),试验结果如下:
1.交互式用户、启动用户:显示正常(说明程序无错误);
2.指定用户:监视程序无法接收到消息。
问题:在身份标识属性为指定用户的前提下,如何显示客户信息?敬请各位兄弟姐妹出谋划策。
 
长夜漫漫,等不到答案,还是睡觉吧。
 
远程数据模块在oncreate时给一个计数值加1,ondestory时把计数值-1;
见DELPHI DEMO
 
TO wbo:
1、显示客户信息:你可以在客户端申请连接时,传递一些客户端信息参数给服务器;
2、显示总人数:既然你的远程数据模块的实例和线程参数为Multiple Instance和Apartment,
也就是说服务器会为每个客户请求建立一个服务线程,那你就可以在远程数据模块中放一个计数器,
就象"房客"所说的,不过要注意的是,计数变量必须是全局变量;
3、要注意的:对于显示这些信息,你要注意,基于你的实例和线程模式,它是一个服务线程,
不是主线程,所以你不能在里面对主线程的VCL对象直接控制,因为这样做是不安全的,你最好是
由用户自动触发去刷新显示或者用向主线程进行线程同步的方法显示。
 
房客,Cash_HYJ:
感谢捧场。不过请注意问题,客户信息的收集早就搞定,关键是如何显示出来。
在dcomcnfg.exe中只要身份标识属性不为指定用户,哪种方法都可以。
[red]身份标识属性为指定用户[/red]的前提下,如何显示客户信息?
我现在用了一个非常老土的办法:在服务器程序中把客户信息写入一个临时文件,
监视程序用TTimer每隔2″检查该文件是否改变,如果改变了,就刷新显示。
目的已经达到了,但感觉白白耗费了资源,因为有时候一天都没有一个用户登录。
 
wbo:
你需要的是不是应用程序服务器上有个memo可以显示目前存在的人,如果有人来了,就
列杂memo里,如果走了,就自动去掉呢?如果是,我可以帮忙!
 
TO wbo:
你要知道,你用计时器去监视的话,会耗费很多CPU时间的,而且也失去了COM服务对象
的意义。还有,你要注意看我上面的第3点(要注意的)。
 
hukaijt:就是你说的意思,请帮忙。
Cash_HYJ:确实很浪费资源。
“由用户自动触发去刷新显示”,由于在服务器线程中不能直接显示,所以我用了
hw:=FindWindow('TMonotorForm','监视XXX');
Postmessage(hw,...);
来向监视器发送刷新消息。可是在身份标识属性为指定用户时,监视器无法接受到消息。
“向主线程进行线程同步的方法”,我不知道如何操作,请指教(详细点)。
谢谢。
 
To wbo:
"在身份标识属性为指定用户时,监视器无法接受到消息"?你是不是在dcomcnfg或者MTS控制台
没有设置好DCOM的安全属性和其他属性?父应该在访问和启动权限中加入EveryOne。
“向主线程进行线程同步的方法”就是用TThread.Synchronize(Method: TThreadMethod),不过
你要注意该方法只能用于线程中,那就看你怎么去用它啦。
 
我正好需要这个功能,请hukaijt告诉我,email wchuanwei@yahoo.com.cn
多谢
 
我也要!多谢!!!!!!! yorkting@21cn.com
 
服务端放一个login(操作员,客户机器名,登录时间,等)接口方法,在login里调用线程的
方法更新主窗口的显示,线程里用Synchronize()保护更新界面显示的方法。
 
Eric Harman的方法是定义一个消息,然后在OnCreate和OnDestroy时发送。监视窗口获得
消息后处理。你可以将客户信息作为消息的参数传递。
 
答案不理想,将就了。
 
顶部