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 ブログとフォーラム、サンプル プロジェクト、たくさんのグーグル検索など)。これを防ぐには、定期的にキューを空にする必要があるようです。

だから私はこれを試しましたが、うまくいきませんでした:

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