【问题标题】:Why am I getting this error with OTL?为什么我在使用 OTL 时收到此错误?
【发布时间】:2014-05-20 13:38:22
【问题描述】:

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

第一次尝试

为此它第一次工作正常,禁用按钮,为异步休眠,然后重新启用它。

但我第二次单击该按钮时,它被禁用但再也不会启用。

第二次尝试

这次我想显示一条消息 x100 次,它第一次也有效,但是当我再次调用该过程时,我收到以下错误 TOminCommunicationEndpoint.Send: Queue is full

使用过这个库的人可以向我解释一下,为什么会出现这个错误?又是否与第一次尝试的问题有关?

【问题讨论】:

  • 当您在调试器下运行此代码时,会引发一个异常,告诉您问题所在。您应该养成使用所提供工具的习惯。调试器很有用。

标签: delphi omnithreadlibrary


【解决方案1】:

您似乎遇到了 OTL 的内部限制。

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

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

【讨论】:

  • 60 个线程限制必须是可自定义的。我有客户的机器比这更多。我想这是 Primoz 的问题。
  • @DavidHeffernan,有时核心数不是多线程的限制因素。如果线程正在等待 I/O,您很容易需要比内核更多的线程。我想限制因素要么是内存,要么是操作系统允许每个进程有多少线程。
  • @LURD 是真的。没关系,60太低了。
  • @user3060326 是的。我相信它需要使用 IOCP 重新实现此功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2018-06-22
相关资源
最近更新 更多