套间问题!
STA套间说明为接口会自动进行同步,本人做了以下测试却不能同步,请大家指教!!!
DWORD WINAPI ThreadProc(void* p)
{
CoInitialize(NULL);
ITest *pv = (ITest*)p;
pv->Test(...);
...
}
Test1()
{
...
CoInitialize(NULL);
ITest *pv;
CoCreateInstance(..., (void**)pv);
CreateThread(NULL, 0, ThreadProc, pv, 0, &dwThreadId);
pv->Test(...);
...
}
在接口的方法中,等待两次调用成功
HRESULT Test(...)
{
static int cnt = 0;
if (cnt != 0)
{
_asm xor eax, eax //<== 在此设断点成功,说明接口调用并未进行同步
cnt++;
}
else
{
cnt++;
while (cnt == 1) Sleep(2);
}
...
cnt--;
}
套间到底为什么东东啊?既然未对接口同步,存在套间有什么意义呢?
问题点数:100、回复次数:4Top
1 楼wzh0591(企鹅)回复于 2006-06-03 22:26:43 得分 0
MARK
Top
2 楼Analyst()回复于 2006-06-04 18:18:29 得分 0
你这样传递接口是错误的,不能直接把接口从一个套间传到另一个套件。先要把接口marshal到一个stream里去,再传递给另一个线程,然后unmarshal出接口来,具体用什么API请自行查阅MSDN。还有一个要点,你的STA套间线程一定要运行windows消息循环,否则另一个线程的对象的方法不可能被执行。Top
3 楼lxpws(你被耍了)回复于 2006-06-05 09:48:56 得分 0
如楼上,访问同步的基础是跨套间传递接口时要将其marshal,这个规则需要COM和用户共同遵循。Top
4 楼XXandOO(麦猪)回复于 2006-06-05 15:36:30 得分 0
组件的套间类型如果是Apartment,则组件只会在STA中激活,STA会与进入该套间的线程(也就是执行CoInitialize的线程)相关,所以接口函数自然会是同步调用的。Top




