1

初めて OTL を使用していますが、Async/Await 抽象化を使用しようとしていました。

さて、何が起こるかを確認するためだけに小さなプログラムを作成しました。これは単なるボタンであり、このプロシージャを呼び出します。

procedure TForm2.Button1Click(Sender: TObject);
var i : integer;
begin
Button1.enabled := false; //Only for second try

for i := 0 to 100 do
begin

Async(
  procedure begin
    sleep(5000);
end).
Await(
  procedure begin

  //First Try - Button1.Enabled := true;

  //Second Try - showmessage('finished')

  end
);

Button1.enabled := true; //Only for the second try.

  end;
end; 

初挑戦

このため、最初は正常に機能し、ボタンを無効にし、非同期のためにスリープしてから有効に戻します。

しかし、ボタンを 2 回目にクリックすると無効になりますが、再び有効になることはありません。

2 回目の試行

今回はメッセージを100回表示したかったのですが、1回目はうまくいきましたが、もう一度プロシージャを呼び出すと、次のエラーが発生しますTOminCommunicationEndpoint.Send: Queue is full

このライブラリを使用したことがある人は、なぜこのエラーが発生するのか説明してもらえますか? そして、それが最初の試行の問題に関連している場合は?

4

1 に答える 1

2

OTL の内部制限に達しているようです。

Async-Await を呼び出すたびに、新しいスレッドが開始され、すぐに戻ります。ループが完了すると、100 スレッドになり、それぞれが Await コードを実行する前に 5 秒間待機します。

私の知る限り、スレッドプールを使用する場合、OTL には 60 の同時スレッドの制限があります。

于 2014-04-08T06:05:42.807 に答える