我开始使用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的任何基本用法吗?
发布于 2015-04-18 10:18:00
这个问题源自OTL内部的一些(可能有问题的)设计解决方案,目前无法解决(除非像其他人所说的那样,通过在主线程中处理消息)。
无论如何,我建议您进一步重构您的方法。例如,您可以只使用一个并行工作人员创建一个BackgroundWorker抽象,然后创建2000个工作项并将它们发送到BackgroundWorker。然后,在后台工作者的Execute方法中,您可以使用Parallel.ForEach来处理任务。
或者您可以创建一个具有多个并行任务(=核数)的BackgroundWorker,然后在每个任务中运行一个正常的for循环。这可能会给你最快的表现。
顺便说一句,如果您使用的是简单形式的Parallel.ForEach,那么新的并行。&For将执行得更好。它不具备ForEach的所有功能,但速度要快得多。
https://stackoverflow.com/questions/29706256
复制相似问题