【发布时间】:2015-04-17 17:53:32
【问题描述】:
我开始使用 OTL 进行多线程处理,并获得了很大的帮助!
各种使用Parallel.ForEach都成功了。但现在我遇到了一个无法解释的案件。
请看下面简单完整的代码:
program test;
{$APPTYPE CONSOLE}
uses
OtlParallel;
var
i: integer;
begin
for i := 1 to 1251 do
Parallel.ForEach(0, 0).Execute(
procedure (const num: integer)
begin
end);
end.
当迭代次数超过1250时,出现错误:
'System Error. Code: 1816. Not enough quota is available to process this command'.
我会误解 OTL 的任何基本用法吗?
【问题讨论】:
-
主线程被线程发布的空消息阻塞。见stackoverflow.com/q/25103602/576719。
-
@LURD 谢谢。我认识到该链接讲述了一个相关问题,但这对我来说有点困难。我总是通过像上面示例这样的简单实现来利用 ForEach,并且不关心任何消息。有没有什么简单的方法可以在 ForEach 期间清理消息?
-
不幸的是,我对 OTL 的内部工作原理知之甚少,无法提出解决方案。我最近看到了几个类似的问题,所以@gabr 或许可以解释一下。
-
在循环中每次调用
Parallel.ForEach()后尝试调用CheckSynchronize。如果它有效,那将是一个创可贴,而不是解决方案。 -
您使用的是哪个版本的Delphi,哪个版本的OTL?在我遇到 60 个线程限制而不是你的限制之前,我能够将限制提高很多。但是,您构建循环的方式并没有多大意义。你想达到什么目的?传统上,您会使用像
Parallel.ForEach(1,1251)这样的 ForEach 循环。
标签: multithreading delphi omnithreadlibrary