2017-01-21 5 views
0

У меня возник вопрос об использовании внешней библиотеки C++ (irrKlang.dll), которая является движком воспроизведения звука. Теперь проблема заключается в том, что когда я получаю событие SoundStopped из него и выполняю действие в основной форме, возникают всевозможные ошибки, связанные с стеком. Позвольте мне показать код:IrrKlang Звуковая библиотека и стоп-потоки событий

namespace WindowsFormsApplication4 

{ 
    public class IsoundFinished : ISoundStopEventReceiver 
    { 
     public delegate void OnSoundStoppedEventHandler(object source, EventArgs e); 
     public event OnSoundStoppedEventHandler IStopped; 

     public void OnSoundStopped(ISound iSound, StopEventCause reason, object userData) 
     { 
      if (reason.ToString() == "SoundFinishedPlaying") 
       IStopped?.Invoke(this, EventArgs.Empty); 
     } 
    } 
} 

Это расширенный класс для меня, чтобы сделать пользовательские действия (например - если звук закончил, поднять событие ...) я создаю экземпляр этого, для случая действие, чтобы получить подвергаются в моем главном классе Form1:

IsoundFinished iStopReceiver = new IsoundFinished(); 

Теперь в моей основной форме, у меня есть эта линия в моем методе Form1(), как раз под моим InitializeComponent():

iStopReceiver.IStopped += new soundFinished.OnSoundStoppedEventHandler(OnStopped); 

Это для подписка на мероприятие Лер. И, наконец, - мой метод OnStopped(), который должен делать вещи, когда песня заканчивается это воспроизведение - это на том же Form1:

private void OnStopped(object sender, EventArgs e) 
     {    
      if (InvokeRequired) 
      { 
       Invoke(new Action<object, EventArgs>(OnStopped), sender, e); 
       return; 
      }    

      btnStop1.PerformClick(); 
     } 

Мой метод Кнопка Stop1 является (для тех, кто работает с IrrKlang) ISound.Stop(); и несколько строк кода, связанных с отображением списка воспроизведения и так далее. Хотя я ее вызова из основного UI нить - который должен обеспечить меня с некоторой степенью защиты резьбы несоосности, все виды ошибок появляются, в основном

Cannot evaluate expression because a native frame is on the top of the call stack. 

Конечно, если я делаю это без обработчика событий, ISound. Стоп(); понижает звук от двигателя, как и должно. Я знаю, что что-то не так происходит с потоками, но я не могу понять, что происходит. Если бы кто-то дал мне несколько советов, я был бы признателен за это.

ответ

0

Ну, похоже, я решил это сам! Все дело в понимании того, как потоки работают в Visual C#. Проблема заключалась в следующем: я фактически ОСНОВАЛ фоновый поток, где мой аудиоинженер запускал событие - поэтому «пока я не выполнил действие после INVOKE в основной теме пользовательского интерфейса, фоновый поток был приостановлен вместе с движком irrKlang. Он не смог правильно очиститься, так что стек вызовов был забит!

Использование BEGININVOKE решило проблему, так как это не ПАУЗА фоновая задача. Вместо этого он запускается. Диаграмма на this ответ дала мне очень необходимую часть информации, которую я искал. Возможно, кому-то понадобится этот ответ, я рад, что помог себе: P

private void OnStopped(object sender, EventArgs e) 
     {    
      if (InvokeRequired) 
      { 
       BeginInvoke(new Action<object, EventArgs>(OnStopped), sender, e); 
       return; 
      }    

      btnStop1.PerformClick();     
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^