【问题标题】:How to add tasks to OTL to be processed LIFO?如何将任务添加到 OTL 以进行 LIFO 处理?
【发布时间】:2016-09-14 14:00:40
【问题描述】:

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

我当前的代码:

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

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

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

【问题讨论】:

    标签: delphi delphi-xe2 omnithreadlibrary


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 2021-09-02
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多