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

Delphi 如何在一个任务组中使用60多个任务?,delphi,delphi-xe2,omnithreadlibrary,Delphi,Delphi Xe2,Omnithreadlibrary,如何在任务组中使用60多个任务?我可以从0循环到N并创建任务,但这不会给我任何消息处理。我使用OTL EventMontior从任务发送消息 我问这个问题的原因是因为使用Indy时,我只能提出60个请求。然而,如果我使用普通的TThread,我不会有这些问题,但我会有其他问题等等 .NET线程池最大值: 框架4.0中的1023(32位环境) 框架4.0(64位环境)中的32768 根据对的回答(关于限制的基本原理),您可以通过更改Winsock.pas中的FD_SETSIZE和OtlThre

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

我问这个问题的原因是因为使用Indy时,我只能提出60个请求。然而,如果我使用普通的TThread,我不会有这些问题,但我会有其他问题等等

.NET线程池最大值:

  • 框架4.0中的1023(32位环境)
  • 框架4.0(64位环境)中的32768
根据对的回答(关于限制的基本原理),您可以通过更改Winsock.pas中的
FD_SETSIZE
和OtlThreadPool.pas中的
cmaxconcurrentworks
的定义来绕过限制。将它们设置为您喜欢的限制。不过,我个人无法担保这一建议


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

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

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

对象句柄的最大数目为最大等待对象数

最大等待对象
Windows.pas
中定义(对于XE3,大约在第1017行:

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

#define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects
WaitForMultipleObjects
如果将高于
MAXIMUM\u WAIT\u OBJECTS
的值作为
nCount
参数传递,则返回错误代码。(如果任何高于
64
的值作为
nCount
参数发送,则返回错误代码,这意味着该值内置于函数本身的实现中。)

快速查看另一个API也不会发现任何接受超过
MAXIMUM\u WAIT\u对象
项的其他API


因此,您的问题的具体答案是:唯一可以做到的方法是编写自己的WinAPI的
WaitForMultipleObjects
替换,然后用对函数的调用替换
WaitForMultipleObjects
中的
WaitForAll
调用。(这是一项非常艰巨的任务,这可能就是为什么在OTL中没有完成这项任务的原因,期望有人在这里给出答案是非常不现实的。)

Rob,问题不是关于OtlThreadPool,而是关于OtlTaskGroup。正如我所说,我不能保证这个建议。我只是在重复我读到的内容,据Jachguate说,我误解了我读到的内容。你比我更能测试这个问题。@RobKennedy为什么不允许我编辑?问题已经结束了,让人们知道怎么做!我有我不知道你在说什么。我没有阻止你编辑任何东西。你想知道怎么做,我还没有告诉你?我知道。你,但是编辑被拒绝了,虽然不是我。我也会拒绝的,出于同样的原因。你需要再投一票来打开这个问题。我可能会把你的一些尝试合并进来在我的答案中插入编辑。
#define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects