DirectSound 与 多线程问题

来源:互联网 发布:淘宝怎么关联营销 编辑:程序博客网 时间:2024/05/29 03:14

         这两天开始研究DirectSound录音,在网上找了一个例程感觉还不错。结构清晰,严谨,数据结构也用的不错。

       于是照着做了一下,OK 果然是不错的东西。可以录音了,但是关闭窗体的时候发现程序还没有退出。郁闷,第一时间发觉应该是线程还没有结束。查了一下程序果然没有结束线程的地方。如下:

  
            while (true)
            {
                    // 等待缓冲区的通知消息
                    mNotificationEvent.WaitOne(Timeout.Infinite, true);
                    // 录制数据
                    RecordCapturedData();
             }

关闭了窗口后,下个中断并没有进入whlie循环体。如是觉得线程已经退出(后面的方法发现根本没有退出),调试---》窗口 ,发现没有如何线程存在(不敢肯定是不Microsoft的bug)。不管了,将true换成以下形式:

      while (!_shouldStop)
            {
                    // 等待缓冲区的通知消息
                    mNotificationEvent.WaitOne(Timeout.Infinite, true);
                    // 录制数据
                    RecordCapturedData();
           }
            MessageBox.Show("线程退出");

控制退出结果不行,MessageBox 没有执行。再次郁闷,找了很多其他办法都不行。后来强制终止线程,mNotifyThread.abort();成功,窃喜。多试几次果然成功。但上面的方式为什么不行呢,应该能够退出循环结束线程阿?再次郁闷,突思奇想,会不会线程执行太频繁了。如是变成以下形式:

 

       while (!_shouldStop)
            {
                    // 等待缓冲区的通知消息
                    mNotificationEvent.WaitOne(Timeout.Infinite, true);
                    // 录制数据
                    RecordCapturedData();
                    Thread.Sleep(50); //防止线程占用过多的CPU时间,必须  
            }
            MessageBox.Show("线程退出");

 

最后,总结。线程的每次轮询时间不能过如频繁。不知道对不对,问题是解决了。有什么不对的地方还望各位

大小虾指点。共同学习

原创粉丝点击