如何将任务添加到 OTL 以进行后进先出处理?

How to add tasks to OTL to be processed LIFO?

我的应用程序扫描文件夹中的图像并从中生成缩略图以在网格中绘制。我有一个 OnDrawCell 处理程序,它向 OTL 添加一个任务以读取所需的图像,调整它的大小(异步)并返回到一个单元格(在主线程中)。这工作正常,除非用户在网格中快速滚动 - 这会将数百个任务添加到队列中。队列的工作方式类似于 FIFO(先进先出),因此用户必须等待所有图像处理完毕才能看到他滚动到的图像。

我当前的代码:

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

如何设置以后进先出(后进先出)方式添加要执行的任务?

当然,已经在处理的任务应该继续。我需要从队列中取出的下一个是最后添加的那个。

我通过在我这边添加堆栈**解决了这个问题。

所有缩略图请求都收集到堆栈中(使其成为 LIFO)。在每个新请求和每个任务完成时,我将任务从堆栈附加到 OTL 队列,直到 GlobalOmniThreadPool.CountQueued >= 1。这样,OTL 队列总是至少填满一项最新收到的任务。

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

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