我写了个com例子,想做一下测试。
com组件为both的,只有一个方法go()
客户端起了2个线程,都进入sta,com对象声明为全局的,其中一个线程用来创建对象,另一个用来访问对象。按说第二个线程访问时应该排队执行,但是执行结果却显示两个线程调用是并发执行的。
大家帮看看为什么?com组件代码:
STDMETHODIMP CTest::go(int s)
{
// TODO: Add your implementation code here Sleep(s * 1000);
return S_OK;
}客户端代码:
#include <windows.h>
#include <stdio.h>
#include <iostream.h>
#include <process.h>#import "D:\vc\comClient\Debug\comClient.dll" no_namespace ITestPtr p;
unsigned Counter; 
unsigned __stdcall SecondThreadFunc( void* pArguments )
{    printf( "[thread:%d]begin\n", ::GetCurrentThreadId());    ::CoInitialize(NULL);
{
//ITestPtr p = NULL;
//HRESULT hr = S_OK;
//hr = p.CreateInstance("comClient.Test");
if( NULL != p )
{
p->go(5);
}

}
::CoUninitialize(); printf("[[thread:%d]]end.........\n", ::GetCurrentThreadId());
    return 0;

void mm()
{
    printf( "[thread:%d]begin\n", ::GetCurrentThreadId());    ::CoInitialize(NULL);
{
p = NULL;
HRESULT hr = S_OK;
hr = p.CreateInstance("comClient.Test"); HANDLE hThread;
unsigned threadID;
printf( "Creating second thread...\n" );
// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID ); if( SUCCEEDED(hr) && (NULL != p) )
{
p->go(5);
}
printf("[[thread:%d]]2.........\n", ::GetCurrentThreadId());
int c;
cin>>c;

}
::CoUninitialize(); printf("[[thread:%d]]end.........\n", ::GetCurrentThreadId());
}int main()

mm();
int a;
cin>>a;


return 0;
}

解决方案 »

  1.   

    这段代码就是调用了一个com,com里sleep几秒,执行结果同时显示了下面内容,中间没有间隔:
    [[thread:1000]]2.........
    [[thread:1001]]2.........说明两个线程是并行的
      

  2.   

    这只能说明这两个组件在两个不同的sta中并行的运行。如果是同一个实例就会出现当一个执行完毕才能执行另一个调用。
      

  3.   

    我觉得没有证明是并发执行。检验是否并发,你可以在go函数里,用多个线程里循环对COM某一全局型变量进行写读操作,看显示结果是否出现不同步的现象。