2012-11-06 7 views
10

私は手書き認識アプリを持っています - ユーザーが指で描くと、アプリは文字を認識します。認識エンジンは、可能な最小の優先度を持つワーカースレッドで実行されます - Thread.MIN_PRIORITY。純粋にCPU /メモリアルゴリズムであり、I/Oはありません。それでも、スレッドが積極的に動いているとき、UIはかなり不安定になります。指のストロークが顕著に遅れて現れます。私はまた、タッチイベントが失われていることに気付く。ワーカースレッドが動作すると、UIが不安定になる

スレッド処理が避けなければならないものはまったくそうではありませんか? CPUのUIスレッドが枯渇しているのはなぜですか?ワーカースレッドを優先順位の低いバックグラウンドスレッドとして扱うようにシステムを納得させるにはどうすればよいですか?

invalidate()onDraw()の間の遅延がシステムに導入されているようです(CPUの枯渇のために)。私は何とか遅れを遅くすることはできますか?

比較的古いハードウェアのテスト - HTC Magic with Android 2.1。

答えて

4

は同じ問題を抱えていたので、私は私のスレッド作られた:仕事のチャンクを処理した後

  1. Thread.yieldを()。

  2. 最小500 ms間隔でUIスレッドに通知される更新が限られているため(再描画がはるかに少ない)。

  3. 作業者はデータの優先順位付けされたバケットで作業しました。これは、ユーザーが現在対話しているビューの更新に重点を置いています。

ここで、UI全体は実際には怠惰ですが、遅延はありません。

は、ここに私の労働者のスケジューリング方法は、(実際の作業は、プロセスの方法によって行われます)次のようになります。

//--low priority 
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

//--as long as there's more work to do, and not cancelled-- 
while (mPriorityBuffer.hasNext() && !isCancelled()) { 

    //--get the work with highest priority-- 
    Work next = mPriorityBuffer.getNext(); 

    //--do work-- 
    Update u = mProcessor.process(next); 

    // collect updates for main thread 
    mUpdates.push(u); 

    long timeNow = Calendar.getInstance().getTimeInMillis(); 
    if(timeNow - timeLast > 500){ 
     //--its been quite a while now, update ui-- 
     postUpdatesToMainThread(); 
     timeLast = timeNow; 
    } 

    //--let UI thread work on updates-- 
    Thread.yield(); 
} 
+0

定期的に収穫が最も効果がありました。 –

+0

こんにちはS.D.、このコードブロックでインデントを修正できますか?また、[言語タグ](http://meta.stackexchange.com/a/75019/321006)を追加して、構文ハイライトが収量がキーワードであると考えるのを防ぐことができますか?オートハイライトは、これがC#コードであることを前提としていたと思います。 – jrh

2

文字認識方法で

@Override 
public void run() { 
    while (!recognited) { 

    //do some script 

    try { 
     Thread.sleep(1); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

をメインのサイクルでThread.sleep(1)を追加するには、この睡眠は少し早いとしばしば

+0

それが認識綴られる、ところで。 Thread.yieldも役立つかもしれませんが、実際には何の効果も感じられませんでした。 – njzk2

+1

Yieldingがうまくいくと思われます。それでも、+1。 –

1

他のスレッドを再開するために仮想マシンをすることができますあなたのGUIのスレッドがでfloadedされている可能性がありお試しくださいその場合、解決策は、UIスレッドで数ミリ秒待ってからワーカースレッドをブーストすることです。このここでの詳細:

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/Oe6k1_bm38o

、多分あなたは何の動きが実際に起こっていない、または動きが十分に重要でない場合のように、あまりにも多くのデータを処理しています。

+0

ディスカッションの関連するアドバイス - タッチ処理を 'dispatchTouchEvent'に移動します。 –

関連する問題