0

私のアプリはフォルダーの画像をスキャンし、それらからサムネイルを生成してグリッドに描画します。OnDrawCellOTL にタスクを追加して、必要な画像を読み取り、サイズを変更 (非同期) し、セルに (メインスレッドで) 描画するハンドラーがあります。ユーザーがグリッドをすばやくスクロールする場合を除いて、これは正常に機能します。これにより、数百のタスクがキューに追加されます。キューは FIFO (先入れ先出し)のように機能するため、ユーザーはスクロール先の画像が表示される前に、すべての画像が処理されるまで待機する必要があります。

私の現在のコード:

CreateTask(
  procedure(const task: IOmniTask)
    ....
  end)
.OnTerminated(
  procedure(const task: IOmniTaskControl)
  begin
  ....
  end)
.Unobserved
.SetPriority(tpIdle)
.Schedule;

LIFO (後入れ先出し) 方式で実行されるタスクの追加を設定するにはどうすればよいですか?

もちろん、すでに処理中のタスクは続行する必要があります。最後に追加されたものになるように、キューから次のものを取得する必要があります。

4

1 に答える 1

0

私は自分の側にスタック**を追加することでこれを解決しました。

すべてのサムネイル要求がスタックに収集されます (LIFO になります)。新しいリクエストごと、およびタスクの完了ごとに、タスクをスタックから OTL キューに まで追加しますGlobalOmniThreadPool.CountQueued >= 1。このように、OTL キューは常に、最新に受信された少なくとも 1 つのタスクで満たされます。

さらに、一部のサムネイルが 2 回以上要求された場合 (ユーザーがスクロールして過去に戻った場合)、スタック内でそれを見つけて先頭に移動できるため、処理が早くなります。

**実際のスタックではなく、アイテムを見つけて移動することもできます。

于 2016-05-18T09:18:19.883 に答える