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