我刚刚发现了 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中排队系统的限制以及如何绕过这个限制。
提前致谢!