gpt4 book ai didi

delphi - 如何在一个任务组中使用超过 60 个任务?

转载 作者:行者123 更新时间:2023-12-03 15:48:34 26 4
gpt4 key购买 nike

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

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

.NET Thread Pool MAX:

  • 1023 in Framework 4.0 (32-bit environment)
  • 32768 in Framework 4.0 (64-bit environment)

最佳答案

根据OtlTask​​Control.pas(基于v3.02源代码),你不能超过64。(不知道你的60来自哪里,但我承认没有尝试超过它。)

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

The maximum number of object handles is 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
如果您将高于 MAXIMUM_WAIT_OBJECTS 的值作为 nCount 参数传递给

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

其他 API 的快速回顾 Multiple-object Wait Functions也不会出现任何其他接受超过 MAXIMUM_WAIT_OBJECTS 项的内容。

因此,您的问题的具体答案是:唯一的方法是编写您自己的 WinAPI 的 WaitForMultipleObjects 替换,然后替换 WaitForMultipleObjects 调用在 TOmniTaskGroup.WaitForAll 中,改为调用您的函数。 (这是一项非常艰巨的任务,这可能就是为什么它没有在 OTL 中完成的原因,并且期望有人在此处的答案中完成它是相当不现实的。)

关于delphi - 如何在一个任务组中使用超过 60 个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13943104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com