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 = then
begin
Application.CreateHandle;
end; Application.Run;
DLL线程中坑爹的Synchronize?的更多相关文章
- [delphi]在DLL中多线程同步Synchronize卡死问题
在dll中多线程同步调用Synchronize不可以,会出现假死卡住的现象.可通过Sendmessage实现. 转网上其他文章解释: Application.Initialize; begin ...
- 【转载】Delphi7从子线程中发送消息到主线程触发事件执行
在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上 ...
- DLL函数中内存分配及释放的问题
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环
http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)
在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了 ...
- 为什么JAVA线程中没有Running状态?
面试官问:为什么 Java 线程没有 Running 状态?我懵了 —— 转 芋道源码 什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如 ...
- 在非UI线程中自制Dispatcher
在C#中,Task.Run当然是一个很好的启动新并行任务的机制,但是因为使用这个方法时,每次新的任务都会在一个新的线程中(其实就是线程池中的线程)运行 这样会造成某些情形下现场调度的相对困难,即使我隔 ...
- 线程中调用python win32com
在python的线程中,调用win32com.client.Dispatch 调用windows下基于COM组件的应用接口, 需要在调用win32com.client.Dispatch前,调用pyth ...
- 为什么说invalidate()不能直接在线程中调用
1.为什么说invalidate()不能直接在线程中调用?2.它是怎么违背单线程的?3.Android ui为什么说不是线程安全的?4.android ui操作为什么一定要在UI线程中执行? 1. ...
随机推荐
- MySQL 高可用架构在业务层面细化分析研究
相对于传统行业的相对服务时间9x9x6或者9x12x5,由于互联网电子商务以及互联网游戏的实时性,所以服务要求7*24小时,业务架构无论是应用还是数据库,都须要容灾互备.在mysql的体系中,最好通过 ...
- Webapp兼容性布局
- (转)SQL中使用or影响性能的解决办法
原文地址:https://www.cnblogs.com/xuxiaona/p/4962727.html 近期做了一个存储过程,执行时发现非常的慢,竟然需要6.7秒! 经排查,发现时间主要都耗在了其中 ...
- mysql 查询语句去重 通过sql去重
url 在表中具有唯一性: 由于定时任务的多进程/代码的多线程/定时任务的调度/脚本的执行时间,导致,破坏了唯一性: SELECT COUNT(1) FROM test_error_tmpUNION ...
- 每天进步一点点—mysql-mysqldump
一. 简单介绍 mysqldump是client用来备份数据库或者在不通数据库之间进行数据迁移的工具,备份内容包括创建表或者装载表的SQL语句 二. 命令格式 备份单个数 ...
- UVALive3415 Guardian of Decency —— 最大独立集
题目链接:https://vjudge.net/problem/UVALive-3415 题解: 题意:选出尽可能多的人, 使得他(她)们之间不会擦出火花.即求出最大独立集. 1.因为性别有男女之分, ...
- jQuery简单纯文字提示条
如何制作jQuery简单纯文字提示条,先介绍提示条(tooltip)的意思是用户鼠标悬停经过事件发生提示title.它们已经呈现在大多数浏览器中,当你可以提供一个链接或图片的title属性,就是用户将 ...
- 关于页面上输入框中 空格 、0 、NULL 的处理 示例
ep.setPositionNum(get("positionNum").toString()); ep.setClasstype(get("classtype" ...
- bleve搜索引擎源码分析之索引——mapping真复杂啊
接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...
- 日元兑换——国内兑换需要护照和签证,国外的机场有兑换ATM
在中国换日元:在中国的商业银行都可以换取日元,但是换汇者必须持有护照.签证等材料.换汇的汇率是按照即时汇率进行结算,如是现钞则按钞买价兑换,另外还要收取0.5%的手续费. 在日本换日元:除了在日本银行 ...