0

我的应用程序扫描文件夹中的图像并从中生成缩略图以在网格中绘制。我有一个OnDrawCell处理程序,它向 OTL 添加一个任务来读取所需的图像,调整它的大小(异步)并返回到一个单元格(在主线程中)。这很好用,除非用户在网格中快速滚动 - 这会将数百个任务添加到队列中。队列的工作方式类似于 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 队列总是充满了至少一个最近收到的任务。

此外,当一些缩略图被多次请求时(用户滚动过去然后返回),我可以在堆栈中找到它并移动到头部,因此它可以更快地得到处理。

**不是实际的堆栈,它还可以找到项目并在其中移动它们。

于 2016-05-18T09:18:19.883 回答