为什么我在OTL中遇到此错误?

时间:2014-04-08 03:54:07

标签: delphi omnithreadlibrary

我第一次使用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; 

首先尝试

为此,它第一次正常工作,禁用按钮,为asyncs休眠,然后再启用它。

但是第二次单击按钮时,它被禁用但从未再次启用。

第二次尝试

这次我想要显示一条消息x100次并且它第一次也能正常工作,但是当我再次调用该过程时,我收到以下错误TOminCommunicationEndpoint.Send: Queue is full

使用此库的人可以向我解释,为什么我会收到此错误?如果它与第一次尝试的问题有关?

1 个答案:

答案 0 :(得分:2)

看来你正在达到OTL的内部限制。

每次调用Async-Await都会启动一个新线程并立即返回。循环完成后,最终会有100个线程,每个线程在执行Await代码之前等待5秒钟。

AFAIK,使用线程池时,OTL中有60个并发线程的限制。