DLL執行緒中坑爹的Synchronize?

2022-03-16 19:58:00 字數 669 閱讀 6405

某次開發語音對講windows程式,採用delphi語言,及delphix的tdxsound控制項。

dxsound提供了tsoundcapturestream類,可以實現指定頻率、位數、聲道的音效卡錄音。在其onfilledbuffer事件處理中,將音訊資料發給指定裝置就能實現流式對講。

先寫了乙個測試exe程式,執行ok。然後需要將其功能封裝為dll函式,供其它應用程式開發時呼叫,封裝完畢,結果發現麥克風的聲音傳送不出去。wtf?

debug發現,呼叫dll開始對講函式後,onfilledbuffer中的**事件**一直未被執行。這在exe程式中是不存在的。記得udpserver控制項有類似的毛病,如果不設定為其threadedevent屬性為true,那麼在dll中其onudpread事件基本上也是收不到任何資訊。

但dxsound中有類似的屬性設定嗎?檢視dxsounds單元的原始碼,發現tsoundcapturestream有乙個fnotifythread屬性(又是執行緒!),當呼叫start方法開始捕捉音效卡時,會建立乙個tsoundcapturestreamnotify通知執行緒,而這個通知執行緒呼叫了synchronize(update)方法向主線程傳送捕捉到了音效卡資訊。

參見:解決方案也是採用了上文中提供的方法,在dll的l工程檔案中加入以下語句 ,問題解決。

then

begin

end;

執行緒join 坑爹

join死主線程跟著死 join 方法的作用,是等待這個執行緒結束 也就是說,t.join 方法阻塞呼叫此方法的執行緒 calling thread 進入 timed waiting 狀態,直到執行緒t完成,此執行緒再繼續 通常用於在main 主線程內,等待其它執行緒完成再結束main 主線程。例子...

python坑爹的黑店 1023 坑爹的黑店

題目描述 今天小明去了乙個風景如畫的地方散心,但是自己帶的飲料喝完了,小明口渴難耐,見不遠處有家小商店,於是跑去買飲料。小明 我要買飲料!店主 我們這裡有三種飲料,礦泉水1.5元一瓶,可樂2元一瓶,橙汁3.5元一瓶。小明 好的,給我一瓶礦泉水。說完他掏出一張n元的大鈔遞給店主。小明 小明環顧四周,就...

坑爹的if語句

前兩天的時候,自己在修改 的時候,自己感覺對除錯比較有心得體會了。但遇到乙個問題,總在乙個函式中返回了false,明明條件就是不應該返回。修改前的示例 如下 string topic topic is not empty if topic.empty return false 我想對這行 加乙個日誌...