2011-06-06 75 views
0

我有一個類來處理它啓動的線程中的一些實時動作。在這個應用程序中還有其他的遊戲,因爲它非常複雜。當這個RT動作開始時,我需要彈出一個窗口並在完成時關閉它。聽起來很簡單。線程UI和噩夢

當這個動作開始和停止時,我會鉤住一些事件。在這些事件處理程序中,我放置代碼:

 private void Voice_SpeakStarted(object sender, TMSpeakStartedEventArgs e) 
    { 

     InfoWindow = new Form(); 
     InfoWindow.Show(); 
    } 

    /// <summary> 
    /// this is the event handler speaking stops 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Voice_SpeakCompleted(object sender, TMSpeakCompletedEventArgs e) 
    { 
     if (InfoWindow.InvokeRequired) 
     { 
      InfoWindow.Invoke(new Action(() => 
      { 
       InfoWindow.Close(); 
      })); 

      InfoWindow.Hide(); 
     } 
    } 

有時我得到一個線程已終止的錯誤。 (調用方法時發生錯誤,目標線程不再存在。)

我總是看到窗口顯示。我似乎無法讓窗戶關閉。

我也看到有時處理程序本身不會被調用。

我需要幫助不好。如果這會有幫助,我可以發佈更多的代碼。

編輯 - 添加更多的代碼 我這是怎麼開始的類

 public void start() 
    { 
     //It's already alive, nothing to do 
     if (alive) return; 

     //Make sure this is the only place where alive is set to true 
     alive = true; 

     Voice.SpeakCompleted += new Speech.TMSpeakCompletedDelegate(Voice_SpeakCompleted); 
     Voice.SpeakStarted += new Speech.TMSpeakStartedDelegate(Voice_SpeakStarted); 


     dispatch = new Thread(new ThreadStart(ProcessSayList)); 
     dispatch.Start(); 
    } 

類的構造函數是

public AnimationControl(dynamic parent) 
    { 
     Parent = parent; 
     Voice = new Speech(); 

     q = Queue.Synchronized(new Queue(1000)); 
     start(); 
    } 
+0

什麼'ProcessSayList'?什麼級別?添加一些上下文! – Blindy 2011-06-06 22:06:00

回答

1

你真的應該專注你的線程,並停止調用代碼由其他管理線程形成任何線程。使用消息隊列將操作傳達給您的線程。這是執行多線程最安全的方法。

實例僞代碼:

Thread1 
{ 
    while (1) 
    { 
    read my last message in my queue; 
    do something according to this message like: 
    openwindow(); 
    or closewindow(); 
    } 
} 

Thread2 
{ 
    My life is short, I just need to post a message to thread1 
} 


Thread3 
{ 
    etc. 
} 

有針對每個系統上這樣的事情準備好使用的結構。通過這樣做,在發生類似問題時,將更容易理解發生的情況。當然,如果你不小心,你的線程程序可以變成絕對線性的;目標是確保某些部分的動作可以並行進行,並且不會創建一系列等待對方的線程,一個接一個:)

0

對於一件事,您打電話給Hide錯誤的線程,即使InvokeRequired返回true。

我也可以猜測,您正在創建一個新線程的Voice實例,並在您收到「關閉」消息時返回,因此有時候會導致您嘗試路由Windows消息的線程。考慮保持這個線程,直到你的窗口實際關閉。

是的,你應該發佈更多的代碼,沒有一行代碼顯示你如何創建/處理該線程。

+0

我在上面添加了更多的代碼 – Jeff 2011-06-06 20:35:47