2011-05-16 8 views
1

この質問は少し曖昧ですが、私はデバッグから有用な情報を得ることができませんでした。BlackBerry - スレッドが応答しない

私は(新しいスレッドを使用して呼び出すスレッドを持っている)を起動し、それがその後、AA、短い時間のために実行されますと、私はこのメッセージが表示されます。

キャッチされない例外:アプリケーション「私のアプリ の名前(201 ) "は応答していません。プロセス は何イライラすることは、私は同じプロセスを実行することができていますが、その後、私のアプリケーションをロックアップスレッド、なしが、私はエラーなしでその作業私のEclipseのコンソールから見ることができている今

を終了しました。だから私は彼らがスレッドで使用している関数のエラーではないことを知っている。

"InvokeLater"関数を使用してスレッドの進行状況をGUIで更新すると、問題が発生する可能性があると私は考えていました。これをかなり激しく迷惑にしています。

提案がありますか?

は私のポスト時に展開するには、問題は私が私の他のスレッドからこのコードの多くを呼び出すためであった: -

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

これはすぐに自分のアプリケーションをクラッシュしたキューを構築されました。

オプションに私のソリューションは、私の関数にこのコードを追加することにより、イベントスレッドを使用していた: -

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

あなたのスレッドが何をしているかを示すコードを投稿することができます。 –

+0

invokeLater()を使用していて、invokeAndWait()を使用していませんか?私がオートコンプリートを使用していたときに、私はその前に落ちてしまった。また、NGACに同意すると、いくつかのコードが非常に役立つでしょう。 – jprofitt

+0

あなたの編集に基づいて、元のコードが二次的であることを指摘したいと思いますが、置換コードは線形であるため、それらを性能に関して比較することはできません。 –

答えて

1

あなたはまさにおっしゃるとおり

私はかなり難しいこれをスパムしていると私はそのを恐れ、おそらく問題は、スレッドの進行と私のGUIを更新するために、「InvokeLater」機能を使用して私と一緒にうそかもしれないと思いました私のスレッドを破壊する。

InvokeLaterを呼び出すとすぐに戻り、UIスレッドが実行するためにキューが機能します。問題は、そのキューが大きくなりすぎると、UIがキューにサービスを提供していないポイントまで下がっていると仮定すると、OSによってアプリケーションが強制終了されるということです。

私が過去にこれを回避するために使用した解決策は、UIスレッドに送信される作業をチャンクすることです。いくつかの種類のアキュムレータオブジェクト、ブールフラグ、およびロックを作成します。ワーカースレッドは、ロックをつかんで作業をアキュムレータに追加します。ブール値フラグは、UI作業者コードが将来アキュムレータを空にするようにスケジュールされているかどうかを示す。そうでない場合は、UI更新コードをスケジュールします。

UI更新コードでは、アキュムレータを空にする予定のUIワーカーが存在しないことを示すために、ロックを取得してアキュムレータからデータをできるだけ早く移動させ、ブール値をfalseとしてマークします。

+0

ありがとうございました。問題があるように見えるので、私はあなたが今提案したことに取り組むつもりです。 – Demonofloom

1

時間がかかり、何かをしながら、あなたがスレッド内でいくつかのオブジェクトに同期化されている場合、および場合UIスレッドは同じオブジェクトに対して同期を試みますが、ロックが解除されるまでブロックされます。

0

特にタイムアウトを延長してもそれが表示される場合、デッドロックになる可能性があります。あなたはスレッドダンプを取って、UIスレッドが何をしているのか見ることができます。ロックを取得するのを待っているなら、おそらくこの方向に掘り下げたいと思うでしょう。

関連する問題