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?的主要内容,如果未能解决你的问题,请参考以下文章
HttpWebRequest 自定义header,Post发送请求,请求形式是json,坑爹的代码