我要用ATL做一个service服务,要求同时支持20人以上的访问,请问在ATL的向导New ATL Object的时候,应该选择Apartment还是Free。
目前我的程序,客户端
//组件库初始化
hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);///支持多线程,MTA
COM组件
选的是free,dual双接口。
我想做到多个用户可是现在访问没有太大的迟钝,可是现在做的连的客户越多,响应时间成倍增长,肯定不满足客户要求。大虾们帮帮忙,俺的项目要完不成了。
目前我的程序,客户端
//组件库初始化
hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);///支持多线程,MTA
COM组件
选的是free,dual双接口。
我想做到多个用户可是现在访问没有太大的迟钝,可是现在做的连的客户越多,响应时间成倍增长,肯定不满足客户要求。大虾们帮帮忙,俺的项目要完不成了。
((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) & defined(_ATL_FREE_THREADED)
如果是前者,与Service的套间模型无关。如果是后者,建议用Free模型;需要同步的地方自己来做。
===========================================
赠人以言,重于珠玉,伤人以言,重于剑戟。——孙子
CSDN助手 签名走马灯
支持20人以上访问就是有20个COM客户端直接访问这个Sevice服务组件。
这个Sevice服务组件主要作用是:在客户端和数据库之间建立一个中间层,获得客户端请求,访问数据库,并返回查询信息。数据库的增、删、改都在这里完成。很容易形成瓶颈,现在就是。
现在选择的已经是Free模式了,需要同步的地方自己来做是什么意思啊。COM不能自己同步吗,不好意思,俺是菜鸟
是将stdafx.h中的
#define STRICT
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#define _ATL_APARTMENT_THREADED
改成#define STRICT
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#define _ATL_FREE_THREADED
#define _WIN32_DCOM 吗?
还是一样,响应时间仍成倍增长。
STDMETHODIMP CAdoDB::ShowMessage()
{
Sleep(5000);
MessageBox(NULL,"hello","提示",MB_OK);
}
启动一个客户程序,通过接口调用ShowMessage()时,经过大约5s弹出对话框,
启动两个客户程序,点击按钮,几乎同时调用ShowMessage(),弹出对话框的时间会变成大约10s,并且两个客户端是大约10s后相继弹出的。敬请指点
WCHAR sz[10];
swprintf(sz,L"%d",::GetCurrentThreadId());
MessageBoxW(NULL,sz,L"",MB_OK);在ShowMessage里这样写,看看各个调用的线程ID是否相等。
lxpws(老烦)有没有邮箱啊,把简要程序发你邮箱里,帮忙看一下
你若要喜爱你自己的价值,你就得给世界创造价值。——歌德
CSDN助手 签名走马灯
把CServiceModule::Run里的
HRESULT hr = CoInitialize(NULL);
换成
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
就行了,看见那段注释了吗?
// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
也多谢seasol(海子@CSDN助手:http://www.cuteie.com/other.asp)的关注。