我要用ATL做一个service服务,要求同时支持20人以上的访问,请问在ATL的向导New ATL Object的时候,应该选择Apartment还是Free。
   目前我的程序,客户端
    //组件库初始化
hr =  CoInitializeEx(NULL,COINIT_MULTITHREADED);///支持多线程,MTA
   COM组件
    选的是free,dual双接口。
  我想做到多个用户可是现在访问没有太大的迟钝,可是现在做的连的客户越多,响应时间成倍增长,肯定不满足客户要求。大虾们帮帮忙,俺的项目要完不成了。

解决方案 »

  1.   

    进程外组件本身不分套间模型,全看它的创建线程所在的套间类型,你将service中的主线程套间类型改为自由套间即可。
      

  2.   

    这是ATL中判断主线程套间类型的宏条件,你可以通过定义相应的宏来达到目的。
    ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) & defined(_ATL_FREE_THREADED)
      

  3.   

    不太明白楼主说的支持20人以上访问具体是什么意思。是有20个客户端通过Socket连接服务器呢,还是有20个COM客户端直接访问这个Sevice服务组件。
    如果是前者,与Service的套间模型无关。如果是后者,建议用Free模型;需要同步的地方自己来做。
    ===========================================
     赠人以言,重于珠玉,伤人以言,重于剑戟。——孙子
     CSDN助手 签名走马灯
      

  4.   

    to seasol(海子@CSDN助手:http://www.cuteie.com/other.asp):
      支持20人以上访问就是有20个COM客户端直接访问这个Sevice服务组件。
    这个Sevice服务组件主要作用是:在客户端和数据库之间建立一个中间层,获得客户端请求,访问数据库,并返回查询信息。数据库的增、删、改都在这里完成。很容易形成瓶颈,现在就是。
      现在选择的已经是Free模式了,需要同步的地方自己来做是什么意思啊。COM不能自己同步吗,不好意思,俺是菜鸟
      

  5.   

    to lxpws(老烦):
       是将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     吗?
    还是一样,响应时间仍成倍增长。
      

  6.   

    在我的ATL组件中,接口IAdoDB中添加接口函数
    STDMETHODIMP CAdoDB::ShowMessage()
    {
      Sleep(5000);
      MessageBox(NULL,"hello","提示",MB_OK);   
    }
    启动一个客户程序,通过接口调用ShowMessage()时,经过大约5s弹出对话框,
    启动两个客户程序,点击按钮,几乎同时调用ShowMessage(),弹出对话框的时间会变成大约10s,并且两个客户端是大约10s后相继弹出的。敬请指点
      

  7.   

    ::Sleep(5000);
    WCHAR sz[10];
    swprintf(sz,L"%d",::GetCurrentThreadId());
    MessageBoxW(NULL,sz,L"",MB_OK);在ShowMessage里这样写,看看各个调用的线程ID是否相等。
      

  8.   

    ID是相等的,测试都是7584。看来是在同一线程下,free线程模式好像没起什么作用。怎么解决呀。
    lxpws(老烦)有没有邮箱啊,把简要程序发你邮箱里,帮忙看一下
      

  9.   

    [email protected],我也帮你看看================================================
     你若要喜爱你自己的价值,你就得给世界创造价值。——歌德
     CSDN助手 签名走马灯
      

  10.   

    原来是VC6的。
    把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
      

  11.   

    明白了,解决了。多谢lxpws(老烦)
    也多谢seasol(海子@CSDN助手:http://www.cuteie.com/other.asp)的关注。
      

  12.   

    由于采用了自由访问模型,访问是不被同步的(从代码执行的ThreadID能看出),所以有冲突的地方注意自己同步。
      

  13.   

    com的同步和一般线程的同步有什么不同吗?