如何将任务添加到要处理的OTL LIFO?

时间:2016-05-18 07:59:36

标签: delphi delphi-xe2 omnithreadlibrary

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

我目前的代码:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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