C#播放声音程序总是卡死

zg80fj 2018-01-26 04:23:51
要求雷达探测到目标后,播放报警声音(WMV格式,很短),雷达探测目标的周期很短,有时候一秒钟可以探测到二十几个目标,每探测到一个目标都会播放报警声音,播放声音用线程处理;
现在的问题是雷达探测的几十个目标后程序就崩溃,按说我用的独立线程,不应该这样,求解,谢谢!



private Thread playsound; //播放声音的线程

//------------------------------------主程序----------------------------------------------------------
while(true)
{
……
检测到目标;
showAlarm();
}
//----------------------------------------------------------------------------------------------
private void showAlarm() //启动线程
{
playsound = new Thread(new ThreadStart(PlaySound));
playsound.Start();
}

private void PlaySound() //播放声音方法
{
string path = "warning.wav";
System.Media.SoundPlayer player = new System.Media.SoundPlayer(path);
player.Play();
}
...全文
875 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmyouren1983 2018-01-30
  • 打赏
  • 举报
回复
使用 ThreadPool 比较好。
xian_wwq 2018-01-30
  • 打赏
  • 举报
回复
如果线程很快就执行结束, 不推荐自行创建线程 使用线程池或者任务比较靠谱
rock_333 2018-01-27
  • 打赏
  • 举报
回复
用dx轻松实现
yuanchao1985 2018-01-27
  • 打赏
  • 举报
回复
重新发一下,上面的代码没有引用命名空间,我把线程的部分给你改了,用线程开销太大,用Task.Factory.StartNew(PlaySound),创建一个异步任务播放声音,也是多线程效果,开销非常小
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();          
        }

        private Thread playsound; //播放声音的线程

        readonly ConcurrentQueue<bool> alarmQueue=new ConcurrentQueue<bool>();//线程安全的并发队列,多个线程访问不会出错
        void main()
        {
            //------------------------------------主程序----------------------------------------------------------
            while(true)
               {
            //             ……
            //            if(检测到目标)
                          alarmQueue.Enqueue(true);    //加入队列                        
                          showAlarm();
               }
            //----------------------------------------------------------------------------------------------
        }   
        private void showAlarm() //启动线程
        {
            bool bPlay = false;
            if (alarmQueue.TryDequeue(out bPlay))//从队列里提取 ,如果队列里没有,就不会创建线程播放声音
            {
                if (bPlay)
                {
                    //playsound = new Thread(new ThreadStart(PlaySound));//建议不要用线程,开销太大
                    //playsound.Start();
                    Task.Factory.StartNew(PlaySound);//用这个,开销小
                }               
            }
        }
        private void PlaySound() //播放声音方法
        {
            string path = "warning.wav";
            System.Media.SoundPlayer player = new System.Media.SoundPlayer(path);
            player.Play();
        }
    }
}
yuanchao1985 2018-01-27
  • 打赏
  • 举报
回复
你这个代码会无限创建线程,无限播放声音,肯定会卡死 正确的做法是,创建一个线程安全的队列,发现一个目标,就往队列里面放一个标志变量 readonly ConcurrentQueue<bool> alarmQueue=new ConcurrentQueue<bool>();//线程安全的并发队列,多个线程访问不会出错 void main() { //------------------------------------主程序---------------------------------------------------------- while(true) { // …… // if(检测到目标) alarmQueue.Enqueue(true); //加入队列 showAlarm(); } //---------------------------------------------------------------------------------------------- } private void showAlarm() //启动线程 { bool bPlay = false; if (alarmQueue.TryDequeue(out bPlay))//从队列里提取 ,如果队列里没有,就不会创建线程播放声音 { if (bPlay) { playsound = new Thread(new ThreadStart(PlaySound)); playsound.Start(); } } } private void PlaySound() //播放声音方法 { string path = "warning.wav"; System.Media.SoundPlayer player = new System.Media.SoundPlayer(path); player.Play(); }
  • 打赏
  • 举报
回复
应当放到 UI 线程。
微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 微信小程序系统教程共有“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]——核心技术”、“微信小程序系统教程[阶段]客服消息+微信支付+九宝电商系统”。 “微信小程序系统教程[阶段]全套课程”包含: 1.微信小程序系统教程[阶段]_客服消息 2.微信小程序系统教程[阶段]_微信支付 3.微信小程序系统教程[阶段]_九宝电商系统 学习“微信小程序系统教程[阶段]”要求有微信小程序的基础。建议先学习“微信小程序系统教程[初级阶段]”、“微信小程序系统教程[中级阶段]”,后在报名“微信小程序系统教程[阶段]”。 阶段讲解的客服消息,是针对小程序的。后台程序用接近底层的技术,没有使用三方技术。这样降低同学们学习成本。 微信支付,这部分课程很有难度,要求同学们认真听讲,有不会的技术问题可以请教老师。购买课程后请联系老师,提供单号,给你源程序。 九宝电商系统是一套十分适和学习、项目的课程。既可以系统的学习微信小程序相关知识,还可以修改后上线。 “微信小程序系统教程[中级阶段]——核心技术”重点讲解微信小程序事件、组件、API 微信小程序系统教程[初级阶段],微信小程序0基础学起,讲解微信小程序开发的基础知识。 购买课程的同学,可赠送就九宝老师编写的《微信小程序开发宝典》。 购课请咨询qq2326321088

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧