2017-01-21 3 views
0

오디오 재생 엔진 인 외부 C++ 라이브러리 (irrKlang.dll) 사용에 관한 질문이 있습니다. 이제 문제는 SoundStopped 이벤트를 꺼내서 기본 폼에서 액션을 수행하면 모든 종류의 스택 관련 오류가 발생한다는 것입니다. 이벤트에 대한, - (소리가 완료되면 ... 이벤트를 마련 예를 들어) 나는 그것의 인스턴스를 생성하고IrrKlang 사운드 라이브러리 및 Stop 이벤트 스레드

나 사용자 지정 작업을하기 위해 확장 된 클래스입니다
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(); 

지금 내 주요 형태로, 난 그냥 내 InitializeComponent를()에서, 내 Form1에() 메소드에이 라인을 가지고 :

그것은을 위해입니다
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 스레드에서 호출했지만 - 스레드 정렬 불량 보호 어느 정도의 저를 제공해야 내가 이벤트 핸들러, ISound없이 그것을 할 경우, 모든 종류의 오류는 대부분

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

물론,이 나타납니다. 중지(); 소리를 엔진에서 떨어 뜨립니다. 스레드에 문제가 있다는 것을 알고 있지만 무슨 일이 일어나는지 알 수는 없습니다. 누군가가 나에게 몇 가지 팁을 줄 것이라고 생각하면 많이 감사 할 것입니다.

답변

0

글쎄, 내가 직접 해결 한 것 같습니다! Visual C#에서 스레드가 어떻게 작동하는지 이해하는 것이 전부입니다. 문제는 이것입니다. 실제로 오디오 엔진이 이벤트를 트리거하는 백그라운드 스레드를 일시 중지했습니다. 따라서 기본 UI 스레드에서 INVOKE 후 조치를 수행 할 때까지 백그라운드 스레드가 전체 irrKlang 엔진과 함께 일시 중지되었습니다. 제대로 제거 할 수 없어 호출 스택이 막혔습니다!

BEGININVOKE를 사용하면 배경 작업을 일시 중지하지 않으므로 문제가 해결됩니다. 대신 실행할 수 있습니다. 다이어그램 this에 대한 답변은 내가 필요로하는 정보를 많이 필요로했다. 어쩌면 누군가가이 답변을 필요로 할 것입니다. 기꺼이 도와 줘서 기쁩니다. P