Как очистить очередь OmniThreadLibrary ThreadPool? - PullRequest
1 голос
/ 31 января 2012

Я только что открыл 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 и как обойти этоограничение.

Заранее спасибо!

1 Ответ

1 голос
/ 25 февраля 2012

Ну, в этом посте формы не показано, как очистить очередь OmniThreadLibrary ThreadPool, но делает , как создать практически неограниченную очередь ожидания для OmniThreadLibrary (что по сути является моей целью):

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

Спасибо за всю помощь, которую я получил здесь, ребята, вы потрясающие!

...