3

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

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

.NET 线程池最大值:

  • Framework 4.0(32 位环境)中的 1023
  • Framework 4.0(64 位环境)中的 32768
4

2 回答 2

4

根据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.hSDK,其中包含:

#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 中完成的原因,并且期望有人在这里回答是非常不现实的。)

于 2012-12-24T19:42:11.683 回答
2

根据对相关问题的回答(关于限制的基本原理),您可以通过更改Winsock.pasOtlThreadPool.pasFD_SETSIZE中的定义来绕过限制。将它们设置为您喜欢的任何限制。不过,我不能亲自担保这些建议。CMaxConcurrentWorkers

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

于 2012-12-19T05:11:31.880 回答