我写了个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;
}
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;
}
解决方案 »
- 我整理和研发了大量和Photoshop类似的图像处理算法代码,本想把这些算法组合起来+一个界面搞成一个简单的软件的,但是这个组合似乎比算法复杂的多,何去何从啊?
- 请教大牛解答 无模对话框的关闭按钮对应的处理函数是什么?
- if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);
- 如何解决字符串操作中的类型匹配
- ISAPI问题!如何编一个ISAPI Filter来将客户端提交的信息进行处理并返回给客户端
- 急需SendMessageTimeout函数使用方法的例子代码?急啊! 在线等!
- 能问一下这段程序为什么会出现非法终止现象吗?
- 在98下如何编一个程序进入域登陆不显示域登陆对话框,500分相送谢谢
- ListView中如何像资源管理器一样显示不同文件的不同图标?
- 查找解释DOC格式的资料
- BITMAP宽度好象不一定要是4的倍数吧。急
- 请问如何给CDialogBar的按钮加上提示文本,如工具条一样,当鼠标停在一个按钮上面便能自动产生文本提示
[[thread:1000]]2.........
[[thread:1001]]2.........说明两个线程是并行的