首先说下小弟目前所遇到的工作中的困难    小弟是一个小县城里的医院收费员   收费员每天所做的工作大体就是  病人来了  在我刷完病人卡后   和病人说应该交费多少钱    因为医院病人繁多 每天和病人口头交流的次数达到500次   每次说话时间大概10秒甚至更长    并且在交流的同时经常发生语言上的冲突(不是我不负责而是县城老百姓素质太低在我收费的同时有许多人没有眼色  还在向我咨询各种问题   我不回答因为我怕短款 并且他们没有排队意识  医院也没有采取各种强制性的排队措施比如架设护栏。。)
因为我以前自学过计算机技术  我突发奇想  想整个收费辅助出来     大体功能就是在收费界面上按下"+"在收费笔次交易成功的同时  利用我的辅助  来提示病人本次应该交费XXXXXX元(播放声音文件实现)。  所以在这里我就想到了键盘钩子   具体代码我就不写了目前功能上弄的差不多了但是 还是有些小BUG 不知道怎么处理   大体情况描述如下:
              在我按下+号的同时开始一个线程播放语音       假如说 我不小心 连续按下两次+   就会播放两次 “ 本次应该交费XXXX ”    声音会出现重叠        我在EXE中实现线程同步可以 但是就是在  键盘钩子的回调函数中一直不知道怎么同步  我连续百度几天没有任何结果 所以我就来这来了 望大牛  大神能给于解答  或思路    还有一点  因为我8年没碰过编程了  当收银员已经把所学的知识荒废了不少  所以大牛大神们在解答的时候 不要说的太潦草      俗话说帮人帮到底送佛送到西   尽可能的给出最详细的解答   。           我实在是太困了  我已经20多个小时没睡觉了 谢谢各位了!!!

解决方案 »

  1.   

    线程播放媒体,弄不好会造成死机,线程停滞,假关闭等故障。如果你要强制关闭线程,要使用API函数。
    建议参考:
    http://blog.csdn.net/jankercsdn/article/details/8874469另:鉴于你的播放,只有一条WAV,不存在并行播放,建议你不采用线程试试。直接控制一个媒体播放器MediaPlayer控件,(或直接使用playSound函数)当出现重复动作时,首先关闭媒体,再重新播放。这样比较方便通畅。
    也可使用第三方的控件,比如多媒体函数库Bass.dll,请参阅 http://www.cnblogs.com/del/category/150851.html
      

  2.   

    我觉得播放声音的话不太好,如果人多声音嘈杂肯定听不清,还有播放声音需要的时间太长,会对业务造成一定影响,不如直接使用LED显示来的方便快捷。
      

  3.   

    自己用Semaphore之类的做个互斥,防止播放重入就可以了。
      

  4.   

    试试用临界区
    aCriticalSection.Enter;
    try
      PlaySound(); //这里用同步播放SND_SYNC
    finally
      aCriticalSection.Leave;
    end;
      

  5.   

    大哥们说了这么多我还是没有理解          我把大体框架说下把   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;
      

  6.   

    不是和你说了不要用线程去播放么,话说WAVE函数我也看过,PLAY这个动作是可以一次把需要播放的缓存全交出去的,没必要用线程
      

  7.   

    对,不要用线程播放,用PlaySound,指定SND_SYNC标志就不会重叠播放了。