2014-06-24 1 views
0

합성 엔진이 말하기 시작하면 릴레이를 켜고 말하기가 끝나면 끄는 프로그램이 있습니다. 내가 컴파일/작업하고있는 PC에서는 100 % 잘 동작합니다. 엔진이 토크를 시작하고, 이벤트가 발생하고, 릴레이가 켜지고, 엔진이 멈추고, 이벤트가 발생하고, 릴레이가 꺼집니다. 아무 문제 없습니다. 단순한!SpeechStarted/SpeechCompleted 이벤트가 무기한 연기 됨

내 랩톱에 프로그램을 넣으면 이벤트가 바로 발생하지 않습니다. 프로그램은 몇 가지 프롬프트를 말하며, 결국 모든 사건이 짧은 순서로 제기 될 것입니다. 이 지연에 어떤 패턴도없는 것 같습니다. 한 번은 몇 초였습니다. 보통 1 분 넘습니다. 때로는 이벤트가 전혀 발생하지 않습니다. (또는 곧 볼 수 있도록 제기되지 않았습니다 ...)

게시 된 애플리케이션과 VS2013의 디버그 환경에서 발생하지만 랩톱에서만 발생합니다 . 메인 PC는 Win8이고, 하나의 랩톱은 Win8이며, 다른 랩톱은 Win7입니다. 내 메인 PC와 win8 랩탑은 환경이 거의 동일하다.

이 문제를 해결할 때 어디서부터 시작해야할지조차 모릅니다. 나는 이벤트 자체가 콘솔에 어떤 텍스트도 출력하지 않고 제로 조건으로 언제든지 발생시키는 이벤트가 아니라는 것을 확인했다 (나는 생각한다). 몇 분 후에 콘솔에서 많은 이벤트가 발생합니다.

저는 성능 문제가 있다고 생각 했었습니다. (비록이 노트북 중 어느 것도 저력을 갖지는 못했지만) 그것을 확인하는 방법이나 그것을 완화하는 방법을 알지 못합니다. 이벤트를 포함한 전체 TTS 엔진을 자체 스레드에 넣으시겠습니까? 그것은 심지어 가능하거나 실용적입니까? 프로그램이 느려지거나 막혀서 이벤트가 지연되는 등의 문제는 실제로 발생하지 않아야합니다.

다음은 관련 코드이며 관련없는 대부분의 내용은 제거되었습니다.

TTS.SpeakStarted += new EventHandler<SpeakStartedEventArgs>(TTS_SpeakStarted); 
    TTS.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(TTS_SpeakCompleted); 


    void TTS_SpeakStarted(object sender, SpeakStartedEventArgs e) 
    { 
     try { 
      if (Properties.Settings.Default.relay_enabled) 
       // do stuff 
     } 
     catch (Exception ex) 
     {} 
    } 
    void TTS_SpeakCompleted(object sender, SpeakCompletedEventArgs e) 
    { 
     try { 
      if (Properties.Settings.Default.relay_enabled) 
       // do stuff 
     } 
     catch (Exception ex) 
     {} 
    } 

답변

0

SpeakStarted/SpeakCompleted 이벤트가 올바르게 작동하지 못했습니다.

내 첫 번째 시도는 내 말하기 방법을 자신의 스레드에 넣고 동기식으로 말하기로 변경하는 것이 었습니다. 그런 식으로 전의 코드를 가질 수 있었고, 끝내기까지 차단할 코드를 말할 수있었습니다. 이것도 작동하지 않았다. 말하기는 이벤트를 발생시키는 데 걸린 시간과 동일한 무기한의 시간 동안 차단되므로 이전 코드가 실행되지만 내 후 코드는 실행되지 않습니다.

내 솔루션은 SpeakStarted/SpeakCompleted 대신 StateChanged 이벤트를 사용하는 것이 었습니다. 어떤 이유로 StateChanged 이벤트는 정상적으로 작동했으며 상태를 사용하여 엔진이 언제 말을 시작했는지를 판단 할 수 있었고 "준비 상태"였을 때 말하기가 완료된 것으로 판단했습니다.