这两天开始研究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("线程退出");
最后,总结。线程的每次轮询时间不能过如频繁。不知道对不对,问题是解决了。有什么不对的地方还望各位
大小虾指点。共同学习