多线程中使用Com

来源:互联网 发布:知乎的野心与终局 编辑:程序博客网 时间:2024/05/14 07:49

 最近做一个类似动画编辑的工具,由于要有类似flash的播放功能,做的时候首先想到的是用windows的SetTimer定时器,也采用了这种方法,但后来测试发现播放不能实时.经过调试发现是SetTimer的精度不够,查了一些资料,就把SetTimer换成了多媒体的定时器timeSetEvent.播放是没问题了,可是声音又没了.声音播放用的是Direct show,声音播放部分专门做成了一个DLL,而且只在主线程中Load了这个DLL.问题出在哪里呢?之前用SetTimer怎么就没问题?换成timeSetEvent就出问题了?

   我们先看一下timeSetEvent这人API:MMRESULT timeSetEvent(UINT uDelayUINT uResolutionLPTIMECALLBACK lpTimeProcDWORD dwUser UINT fuEvent);看到第三个参数,这是个回调函数,每次有事件的时候都会调用这个函数,问题就出在这个回函数中,timeSetEvent每次有事件时都会开辟一个线程,而这个回调函数就是线程函数,在主线程Load播放声音的DLL时,就会调用CoInitialize(NULL),但播放的动作是在上面的回调函数中,也就是另一个线程中,结果就出问题了.我们知道,在多线程中使用Com时,应在每个线程中都对Com进行初使化,这样才能保证不会出错.

   问题解决:在每个事件到来的时候都对Com进行实例化,CoInitializeEx(NULL, COINIT_MULTITHREADED),当然退出时应对应的调用CoUninitialize().

原创粉丝点击