如何在一个任务组中使用超过 60 个任务?我可以从 0 循环到 N 并创建任务,但这不会给我任何消息处理。我使用 OTL EventMontior 从任务发送消息..
我问的原因是因为使用 Indy 我被限制为 60 个请求。但是,如果我使用普通的 TThread,我不会遇到这些问题,但会遇到其他问题等。
.NET 线程池最大值:
- Framework 4.0(32 位环境)中的 1023
- Framework 4.0(64 位环境)中的 32768
如何在一个任务组中使用超过 60 个任务?我可以从 0 循环到 N 并创建任务,但这不会给我任何消息处理。我使用 OTL EventMontior 从任务发送消息..
我问的原因是因为使用 Indy 我被限制为 60 个请求。但是,如果我使用普通的 TThread,我不会遇到这些问题,但会遇到其他问题等。
.NET 线程池最大值:
- Framework 4.0(32 位环境)中的 1023
- Framework 4.0(64 位环境)中的 32768
根据OtlTaskControl.pas
(基于v3.02源),你不能超过64。(不知道你的60是从哪里来的,但我承认没有试图超过它。)
TOmniTaskGroup.WaitForAll
(大约 #3300 行)使用 WinAPI 函数WaitForMultipleObjects
,并根据 MSDN 文档:
对象句柄的最大数量是 MAXIMUM_WAIT_OBJECTS。
MAXIMUM_WAIT_OBJECTS
定义在Windows.pas
(对于 XE3,大约在第 1017 行:
MAXIMUM_WAIT_OBJECTS = 64;
{$EXTERNALSYM MAXIMUM_WAIT_OBJECTS}
声明本身来自WinNT.h
SDK,其中包含:
#define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
WaitForMultipleObjects
如果您将一个高于参数的值传递给它,则返回一个错误MAXIMUM_WAIT_OBJECTS
代码nCount
。(如果将任何高于此64
的值作为参数发送,则会返回错误代码nCount
,这意味着该值已内置到函数本身的实现中。)
对其他 API多对象等待函数的快速回顾也没有发现任何其他可以接受超过MAXIMUM_WAIT_OBJECTS
项目的东西。
因此,您的问题的具体答案是:唯一可以做到的方法是编写您自己的 WinAPI 替代品WaitForMultipleObjects
,然后将WaitForMultipleObjects
调用替换为TOmniTaskGroup.WaitForAll
对您的函数的调用。(这是一项非常艰巨的任务,这可能就是为什么它没有在 OTL 中完成的原因,并且期望有人在这里回答是非常不现实的。)
根据对相关问题的回答(关于限制的基本原理),您可以通过更改Winsock.pas和OtlThreadPool.pasFD_SETSIZE
中的定义来绕过限制。将它们设置为您喜欢的任何限制。不过,我不能亲自担保这些建议。CMaxConcurrentWorkers
请注意,通过修改Winsock.pas,您删除了在应用程序中使用 Delphi 提供的运行时包的能力。(您仍然可以使用自己编译的包;它们只是不能与内置包同名。)