2011-05-16 107 views
1

對不起,這個問題有點含糊,但我一直沒能從調試中得到任何有用的信息。黑莓 - 線程無響應

我有一個線程,我打電話使用新的Thread()開始,那麼它會爲AA短的時間內運行,我收到此消息:

未捕獲的異常:應用程序「我的應用程序 名(201 )「沒有響應;過程 終止

現在什麼是令人沮喪的是我能夠運行相同的過程,但不帶螺紋,然後鎖定了我的申請,但我可以從我的Eclipse控制檯,它的工作看沒有錯誤。所以我知道他們不是我在線程上使用的函數的錯誤。

我想也許這個問題可能與我一起使用「InvokeLater」函數來更新與線程進度我的GUI,我發送這個很難,我擔心它摧毀我的線程。

有什麼建議嗎?

要在我的崗位擴大,這個問題是因爲我從我的其他線程中調用這個代碼ALOT: -

invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       _output.setText(_output.getText() + "\n" + msg); 
      } 
     }); 

這是建立一個隊列,迅速崩潰我的應用程序。

我的選擇的解決方案是通過將此代碼添加到我的函數使用事件線程: -

synchronized(Application.getEventLock()) { 
     _output.setText("new text " + System.currentTimeMillis()); 
    } 
+2

您可能需要發佈一些代碼來顯示您的主題。 – 2011-05-16 20:51:20

+0

你確定你正在使用invokeLater()而不是invokeAndWait()嗎?在我使用自動完成功能之前,我陷入了這個問題。另外我同意NGAC,一些代碼會非常有幫助。 – jprofitt 2011-05-16 21:25:42

+0

根據您的編輯,我想指出您的原始代碼是二次的,而替換代碼是線性的,所以您無法在性能上進行比較。 – 2011-05-17 16:26:33

回答

1

你說得對:

我想也許這個問題可能和我躺在一起使用「的invokeLater」功能來更新我的線程進展GUI,我濫發這相當困難,我擔心它破壞我的線程。

調用InvokeLater立即返回,隊列工作供UI線程執行。問題是,如果該隊列變得太大,操作系統將會終止你的應用程序,假設UI已經陷入了無法爲隊列服務的程度。

我以前用來解決這個問題的解決方案是將發送到UI線程的工作分塊。製作某種累加器對象,布爾標誌和鎖。工作者線程然後抓住鎖並將工作添加到累加器。布爾標誌指示UI工作者代碼是否計劃在將來清空累加器。如果沒有,請安排您的UI更新代碼。

在UI更新代碼中,您抓住鎖並儘快將數據從累加器中移出,並將布爾值標記爲false,以顯示不再有UI工作人員計劃清空累加器。

+0

謝謝,這似乎是問題,我會開始處理你現在的建議。 – Demonofloom 2011-05-17 09:03:56

1

如果是一些對象的線程內,而做一些耗時的同步,並且如果你的UI線程嘗試在同一個對象上進行同步,它會阻塞,直到釋放鎖。

0

它可能是一個死鎖,尤其是如果你延長超時並仍然看到它。你可以採取線程轉儲並查看UI線程正在做什麼。如果它正在等待獲得鎖定,那麼您可能想要朝這個方向挖掘。