1

我刚刚发现了 OmniThreadLibrary 并开始使用它。我正在尝试启动最多不超过 20 个任务并将其余任务发送到队列中。

我修改了 OmniThreadLibrary 的00_Beep项目来做到这一点:

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 博客和论坛、示例项目、google 了很多等等),似乎为了防止这种情况,我必须定期清空队列。

所以我尝试了这个,但没有奏效:

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中排队系统的限制以及如何绕过这个限制。

提前致谢!

4

1 回答 1

1

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

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

感谢我在这里收到的所有帮助,你们太棒了!

于 2012-02-25T00:34:16.237 回答