最近遇到一个问题:有一个工作线程,会创建一个新线程作为音频处理线程,然后再调用WaveInOpen、WaveInReset、WaveInStart等函数来操作录音设备。音频处理线程处理录音设备的MM_WIN_OPEN、MM_WIN_DATA等消息。程序执行顺序是先创建音频处理线程,然后再调用WaveInOpen函数。
在某些情况下,WaveInOpen调用成功,但音频处理线程无法收到MM_WIM_OPEN消息。因此LZ怀疑在CreateThread返回之前,线程是否已经完成所有的初始化工作并可以立即接收消息。

解决方案 »

  1.   

    CreateThread只要生成线程就返回,不会等待线程运行什么代码。
      

  2.   

    要想同步,你应该自定义一个消息,当子线程初始化完毕后向父线程发消息,而父线程在该消息的处理函数中调用WaveInOpen。
      

  3.   

    你可以设2个断点,一个是执行完CreateThread下一句设断点,另一个是在线程的那个功能设断点,看程序先执行哪个断点。
    个人猜测应该是第一个断点先停,创建线程需要时间,并不是CreateThread完马上就可以执行到你线程里的那句代码。
      

  4.   

    lz的意思是CreateThread创建线程完全成功以后,(即已经开始运行),之后再调用WaveInOpen之类的函数吗?
    如果这样的话,你可以在线程中发送消息到主线程,在主线程的消息响应函数中调用这些方法
      

  5.   

    谢谢LS各位的回答,我刚刚解决了这个问题,通过一个测试,可以证明,在线程拥有消息队列之前,其它线程向此线程发送消息是不会成功的。
    有关线程何时会创建消息队列的说明在《Windows核心编程》第624页有说明:当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个 THREADINFO结构,并将这个数据结构与线程联系起来。 也可以参考:http://topic.csdn.net/t/20030618/17/1931171.html我是这么发现这个问题的,在音频处理线程的GetMessage之前加了一句Sleep(2000),结果在所有测试中都无法捕获到MM_WIM_OPEN消息。
      

  6.   

    楼主的意思是让线程先跑起来?跑到GetMessage处?让waveinOPen慢一些吗?
      

  7.   

    能够确保无误的做法是,设一个事件,主线程在建立新线程后等待该事件,然后waveinOpen。
    新线程在peekmessage一次后将该事件置为通知状态。