字很多,不过对高手来说不太难,请耐心看看,先谢谢了!mfc对话框程序,语音接收播放端,只有一个主对话框,如果收到一个采集发送端的播放请求,就创建一个播放窗口(是一个非模态对话框),每个播放窗口初始化时会开一个组播接收线程,现在有个问题,如果主窗口收到了某个采集端发送的停止播放消息,通过调用播放窗口指针的DestroyWindow()函数就可以结束掉窗口对应的接收播放线程,但如果是主对话框关闭时做同样的操作,则有时候对应的播放窗口的线程不会退出,从而导致有一些内存泄露,看着很不爽。后来我在主对话框中的OnDestroy()中加了个Sleep(100),就可以关闭播放窗口的线程了,问题就出来了,怎么在关闭主对话框时能等各个播放窗口的线程完全退出再关闭?

解决方案 »

  1.   

    WaitForSingleObject
    等待线程句柄是否受信,确定播放线程是否退出
      

  2.   

    每个线程退出前PostMessage一个消息通知给主对话框
      

  3.   

    在主线程调用WaitForSingleObject,估计看着更不爽吧。感觉像死了一样
      

  4.   

    这个线程是类似这样的
    while(1)
    {
       if (!m_Audio.Receive(......))  // m_Audio是一个封装socket的组播类对象
       {
           break;
       ]
       {
            // 播放或其他工作.....
       } 
    }
    reture 0;如果窗口关闭receive方法好像能测到,所以“死”的时间应该不会很长
      

  5.   

    是不是关闭主对话框时,通知各个播放窗口销毁的实际不对呢?我是放在了主对话框的OnDestroy()中,一般大家都怎么处理呢?
      

  6.   

    我觉得要是多个线程的话,还是再做一个控制线程,启动工作线程时记录一个数。工作线程和控制线程共享一个状态区,用来控制工作线程。在要结束工作线程时,控制线程刷新状态区,工作线程看到状态区改变,就结束自己,或使自己挂起,并改变记录数,用以通知控制线程自己已经结束。控制线程循环检测记录数,可以设定一个循环数,循环内部加一个sleep,如果在指定的循环次数内没有结束完全部线程,再强制杀死线程。
      

  7.   

    如果是被动收到了关闭通知关闭的可以正常退出播放窗口的线程,如果是主动关闭主对话框,在主对话框的OnDestroy()中关闭就不一定能正常退出播放窗口的线程(有时候可以,有时候就不能,加了一个Sleep(100)好像情况会好点,基本可以正常退出),那关闭主对话框时应该放在什么地方来关闭所有的播放窗口呢?
      

  8.   

    WaitForSingleObject好像是有用的,我在对话框的OnDestroy()的最后加上了
    WaitForSingleObject(m_pThread->m_hThread,INFINITE);可以正常退出线程了。但这样做是不是有点不好?万一线程很长时间没退出,主线程岂不是关不掉了?
      

  9.   

    你先创建一个事件,SetEvent,ResetEvent处理一下。有消息处理的话,最好用MsgWaitFor