Я только что открыл 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, примеры проектов, много гуглил и т. Д.), Кажется, что для предотвращения этого я должен периодически очищать очередь.
Так что я пытался, но это не помоглоt работа:
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 и как обойти этоограничение.
Заранее спасибо!