如何在任务组中使用60多个任务?

时间:2012-12-18 23:16:51

标签: delphi delphi-xe2 omnithreadlibrary

如何在任务组中使用60多个任务?我可以从0循环到N并创建任务,但这不会给我任何消息处理。我使用OTL EventMontior从任务发送消息..

我问的原因是因为使用Indy我限制为60个请求。但是,如果我使用正常的TThread,我将不会遇到这些问题,但我会遇到其他问题等。

  

.NET线程池MAX:

     
      框架4.0(32位环境)中的
  • 1023
  •   框架4.0(64位环境)中的
  • 32768
  •   

2 个答案:

答案 0 :(得分:4)

根据OtlTaskControl.pas(根据v3.02来源),你不能超过64.(不知道你的60来自哪里,但我承认没有试图超过它。)

TOmniTaskGroup.WaitForAll(大约第3300行)使用WinAPI函数WaitForMultipleObjects,并根据MSDN文档:

  

最大对象句柄数为MAXIMUM_WAIT_OBJECTS。

MAXIMUM_WAIT_OBJECTSWindows.pas中定义(对于XE3,大约在#1017行:

MAXIMUM_WAIT_OBJECTS = 64;
{$EXTERNALSYM MAXIMUM_WAIT_OBJECTS}

声明本身来自SDK中的WinNT.h,其中包含:

#define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects

WaitForMultipleObjects如果您向MAXIMUM_WAIT_OBJECTS参数传递高于nCount的值,则会返回错误代码。 (如果任何高于64的值作为nCount参数发送,则返回错误代码,这意味着该值内置于函数本身的实现中。)

快速审核其他API Multiple-object Wait Functions并未发现任何可接受超过MAXIMUM_WAIT_OBJECTS项目的内容。

因此,您问题的具体答案是:唯一可以做的就是为WinAPI的WaitForMultipleObjects编写自己的替代品,然后替换WaitForMultipleObjects中的TOmniTaskGroup.WaitForAll来电。而是调用你的功能。 (这是一项非常艰巨的任务,这可能是为什么它没有在OTL中完成,并且期望有人在这里回答这个问题是非常不切实际的。)

答案 1 :(得分:2)

根据对a related question的回答(关于限制的基本原理),您可以通过更改 Winsock.pas 中的FD_SETSIZE和{的定义来绕过限制 OtlThreadPool.pas 中的{1}}。将它们设置为您喜欢的任何限制。不过,我不能亲自担保这个建议。

请注意,通过修改 Winsock.pas ,可以删除在应用程序中使用Delphi提供的运行时包的功能。 (您仍然可以使用自己编译的软件包;它们不能与内置软件包具有相同的名称。)

相关问题