Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > SoundPlayer - как проигрывать из ресурсов


Автор: transkriptsiya 26.1.2015, 22:58
У меня в ресурсах лежит 100 .wav файлов (имена 1 2 3 .... 100) длинной 1-2 секунды. Мне нужно их проиграть все по очереди.
Код


 private void button_play_Click(object sender, EventArgs e)
        {
            int i = 0;

            do{
                string aa = "_" + i;
                SoundPlayer sps = new SoundPlayer(Properties.Resources.ResourceManager.GetStream(aa.ToString()));
                sps.PlaySync();
             
                
                i++;
            }
            while(i<102);
        }


Все проигрывает как нужно, только при этом окно зависает до окончания цикла. Как быть?

Автор: Rockie 26.1.2015, 23:30
Полагаю надо смотреть в сторону многопоточности

Автор: transkriptsiya 28.1.2015, 14:58
ок
Код


 public void button_play_Click(object sender, EventArgs e)
        {
            button_play.Enabled = false;  //!!!
            Thread thread = new Thread(metod);
            thread.Start();
            thread.IsBackground = true;
            
        }

         void metod()
        {
            int i = 0;
            do
            {

                string aa = "_" + i;
                SoundPlayer sps = new SoundPlayer(Properties.Resources.ResourceManager.GetStream(aa.ToString()));
                sps.PlaySync();

                i++;
            }
            while (i < 10);
         button_play.Enabled = true;  //!!! говорит что нельзя из вторичного потока рулить первичным
         
        }

После запуска потока отключаю кнопку и не знаю как включить обратно из вторичного потока после его завершения.
Подскажите как включить кнопку обратно

Автор: Ilya81 28.1.2015, 15:00
Цитата(transkriptsiya @  28.1.2015,  14:58 Найти цитируемый пост)
После запуска потока отключаю кнопку и не знаю как включить обратно из вторичного потока после его завершения.
Подскажите как включить кнопку обратно

Использовать метод Invoke у класса Form.

Автор: infarch 30.1.2015, 11:08
Если использовать дотнет 4.5 то задача весьма тривиальная: 

Код

        private async void button2_Click(object sender, EventArgs e)
        {
            Button b = sender as Button;
            b.Enabled = false;

            for (int i = 0; i < 30; i++)
            {
                await PlayAsync(i);
            }
            b.Enabled = true;
        }

        private Task PlayAsync(int trackNumber)
        {
            return Task.Factory.StartNew(() =>
            {
                Play(trackNumber);
            });
        }

        private void Play(int trackNumber)
        {
            Console.WriteLine("Playing track {0}", trackNumber);
            Thread.Sleep(1000);
        }



Если фреймворк более ранний, читайте про Invoke, как тут советовали.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)