首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清空OmniThreadLibrary ThreadPool队列?

如何清空OmniThreadLibrary ThreadPool队列?
EN

Stack Overflow用户
提问于 2012-01-30 20:13:38
回答 1查看 1.3K关注 0票数 1

我刚刚发现了OmniThreadLibrary &开始玩它。我试图启动最多不超过20个任务,并将剩下的任务发送到队列中。

为此,我修改了OmniThreadLibrary的00_Beep项目:

代码语言:javascript
复制
const
  TASKS_COUNT = 100;

procedure TfrmTestSimple.btnBeepClick(Sender: TObject);
var
    I: Integer;
begin
    with OmniEventMonitor do
        for I := 1 to TASKS_COUNT do
            Monitor(CreateTask(Beep, 'Beep-' + IntToStr(I))).Schedule;
end;

procedure TfrmTestSimple.FormCreate(Sender: TObject);
begin
    GlobalOmniThreadPool.MonitorWith(OmniEventMonitor);
    GlobalOmniThreadPool.MaxExecuting := 20;
    GlobalOmniThreadPool.MaxQueued := 0;
end;

它有效,但如果我增加#的任务(即。TASKS_COUNT),比方说,7000,我得到了一个例外:

TOmniCommunicationEndpoint.Send: Queue is full

我看了我能找到的任何东西(OTL博客和论坛,示例项目,谷歌很多等等),似乎为了防止这种情况,我必须定期清空队列。

所以我试了一下,但没有用:

代码语言:javascript
复制
procedure TfrmTestSimple.OmniEventMonitorTaskTerminated(const task: IOmniTaskControl);
begin
    Task.Terminate(1);       // I also tried: Task.Terminate(0);
    Task.Comm.Reader.Empty;  // Task.Comm.OtherEndpoint.Reader.Empty; didn't work either
    Task.Comm.Writer.Empty;  // Task.Comm.OtherEndpoint.Writer.Empty; didn't work either
end;

关于如何清空队列并避免此异常,有什么建议吗?

我知道,有些人可能会说队列中有这么多的任务是荒谬的,只需说它既不是一个假设的问题,也不是我的问题的范围来告诉我重新设计我的应用程序,此时我只需要知道OTL中排队系统的限制以及如何绕过这个限制。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-25 00:34:16

这个表单post没有显示如何清空OmniThreadLibrary ThreadPool队列,但确实展示了如何为OmniThreadLibrary创建一个几乎无限的等待队列(这基本上是我的目标):

http://otl.17slon.com/forum/index.php/topic,354.0.html

谢谢你帮助我,你们真是太棒了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9070142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档