DLL线程中坑爹的Synchronize?

Posted jack kwok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DLL线程中坑爹的Synchronize?相关的知识,希望对你有一定的参考价值。

1, 缘起

某次开发语音对讲windows程序,采用delphi语言,及delphix的TDXSound控件。

DXSound提供了TSoundCaptureStream类,可以实现指定频率、位数、声道的声卡录音。在其OnFilledBuffer事件处理中,将音频数据发给指定设备就能实现流式对讲。

先写了一个测试EXE程序,运行OK。然后需要将其功能封装为DLL函数,供其它应用程序开发时调用,封装完毕,结果发现麦克风的声音发送不出去。WTF?

2,分析

debug发现,调用DLL开始对讲函数后,OnFilledBuffer中的回调事件代码一直未被执行。这在exe程序中是不存在的。记得uDPServer控件有类似的毛病,如果不设置为其ThreadedEvent属性为True,那么在DLL中其ONUDPRead事件基本上也是收不到任何信息。

但DXSound中有类似的属性设置吗?查看DXSounds单元的源码,发现TSoundCaptureStream有一个FNotifyThread属性(又是线程!),当调用start方法开始捕捉声卡时,会创建一个TSoundCaptureStreamNotify通知线程,而这个通知线程调用了Synchronize(Update)方法向主线程发送捕捉到了声卡信息。

 

查询资料发现,若工程文件是DLL而不是EXE的话,Application默认不创建窗口句柄,因此Synchronize 向Application发送消息根本无法响应。

参见:https://www.cnblogs.com/enli/archive/2010/09/28/1837728.html

 

3,解决

解决方案也是采用了上文中提供的方法,在DLL的l工程文件中加入以下语句 ,问题解决。

Application.Initialize;

if Application.Handle = 0 then
begin
    Application.CreateHandle;
end;

Application.Run;

 

以上是关于DLL线程中坑爹的Synchronize?的主要内容,如果未能解决你的问题,请参考以下文章

和SharpDX坑爹的Variant刚正面

HttpWebRequest 自定义header,Post发送请求,请求形式是json,坑爹的代码

说说background那些坑爹的事儿~

PHP 杂谈 坑爹的file_exists

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

问题记录 坑爹的跨域问题