博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DLL线程中坑爹的Synchronize?
阅读量:4319 次
发布时间:2019-06-06

本文共 911 字,大约阅读时间需要 3 分钟。

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 thenbegin    Application.CreateHandle;end;Application.Run;

 

转载于:https://www.cnblogs.com/jackkwok/p/8675676.html

你可能感兴趣的文章
HIbernate Y映射 Map、list、set
查看>>
Ubuntu双系统启动卡死
查看>>
代码之密
查看>>
XDM、GDM和KDM
查看>>
Java并发编程
查看>>
导致“mysql has gone away”的两种情况
查看>>
DTRACE -MYSQL
查看>>
autoScroll不显示滚动条
查看>>
LabVIEW动态添加控件
查看>>
Azure SQL 数据库与新的数据库吞吐量单位
查看>>
VC++2012编程演练数据结构《13》单链表
查看>>
Yii2简单的 yii2-phpexcel导出
查看>>
ubuntu/deepin 下下载wxpython
查看>>
A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)
查看>>
Apache JServ protocol服务 怎么关闭?
查看>>
使用 SQL SERVER PROFILER 监测死锁
查看>>
男人的眼泪是血 很容易就会流完
查看>>
#define 中#和##的作用
查看>>
心情日记
查看>>
20145320\20145319 《信息安全系统设计基础》实验三
查看>>