首先說下小弟目前所遇到的作業中的困難 小弟是一個小縣城里的醫院收費員 收費員每天所做的作業大體就是 病人來了 在我刷完病人卡后 和病人說應該交費多少錢 因為醫院病人繁多 每天和病人口頭交流的次數達到500次 每次說話時間大概10秒甚至更長 并且在交流的同時經常發生語言上的沖突(不是我不負責而是縣城老百姓素質太低在我收費的同時有許多人沒有眼色 還在向我咨詢各種問題 我不回答因為我怕短款 并且他們沒有排隊意識 醫院也沒有采取各種強制性的排隊措施比如架設護欄。。。。。)
因為我以前自學過計算機技術 我突發奇想 想整個收費輔助出來 大體功能就是在收費界面上按下"+"在收費筆次交易成功的同時 利用我的輔助 來提示病人本次應該交費XXXXXX元(播放聲音檔案實作)。 所以在這里我就想到了鍵盤鉤子 具體代碼我就不寫了
目前功能上弄的差不多了但是 還是有些小BUG 不知道怎么處理 大體情況描述如下:
在我按下+號的同時開始一個執行緒播放語音 假如說 我不小心 連續按下兩次+ 就會播放兩次 “ 本次應該交費XXXX ” 聲音會出現重疊 我在EXE中實作執行緒同步可以 但是就是在 鍵盤鉤子的回呼函式中一直不知道怎么同步 我連續百度幾天沒有任何結果 所以我就來這來了 望大牛 大神能給于解答 或思路 還有一點 因為我8年沒碰過編程了 當收銀員已經把所學的知識荒廢了不少 所以大牛大神們在解答的時候 不要說的太潦草 俗話說幫人幫到底送佛送到西 盡可能的給出最詳細的解答 。
我實在是太困了 我已經20多個小時沒睡覺了 謝謝各位了!!!
uj5u.com熱心網友回復:
執行緒播放媒體,弄不好會造成死機,執行緒停滯,假關閉等故障。如果你要強制關閉執行緒,要使用API函式。建議參考:
http://blog.csdn.net/jankercsdn/article/details/8874469
另:鑒于你的播放,只有一條WAV,不存在并行播放,建議你不采用執行緒試試。直接控制一個媒體播放器MediaPlayer控制元件,(或直接使用playSound函式)當出現重復動作時,首先關閉媒體,再重新播放。這樣比較方便通暢。
也可使用第三方的控制元件,比如多媒體函式庫Bass.dll,請參閱 http://www.cnblogs.com/del/category/150851.html
uj5u.com熱心網友回復:
自己控制一下,5秒內不重復播放啊uj5u.com熱心網友回復:
兩個方案,可選1.如果舊的播放執行緒沒結束,新的播放執行緒就不播放
2.如果舊的播放執行緒沒結束,就停止,然后播放新的
uj5u.com熱心網友回復:
自己用Semaphore之類的做個互斥,防止播放重入就可以了。uj5u.com熱心網友回復:
試試用臨界區aCriticalSection.Enter;
try
PlaySound(); //這里用同步播放SND_SYNC
finally
aCriticalSection.Leave;
end;
uj5u.com熱心網友回復:
不要把執行緒物件定義成區域變數,定義成全域的,每次播放時,判斷一下這個全域執行緒變數存在不存在,就可以控制了uj5u.com熱心網友回復:
大哥們說了這么多我還是沒有理解我把大體框架說下把
function keyd(....... ):DWORD;stdcall;//鍵盤鉤子回呼函式
begin
if (wp=vk_ADD) and((1 shl 31) and lp=0)
then
beginthread(nil,0,@play,nil,0,Threadhandle) ;//播放音樂 音樂是由20個WAV檔案組成
end;
uj5u.com熱心網友回復:
哎,我把工程檔案給誰誰能幫我完成?uj5u.com熱心網友回復:
不是和你說了不要用執行緒去播放么,話說WAVE函式我也看過,PLAY這個動作是可以一次把需要播放的快取全交出去的,沒必要用執行緒uj5u.com熱心網友回復:
對,不要用執行緒播放,用PlaySound,指定SND_SYNC標志就不會重疊播放了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71389.html
標籤:VCL組件開發及應用
下一篇:關于記錄型別變數的使用
