3

Taskgroupで 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 を超えることはできません。

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_OBJECTSnCountます。(より高い値がパラメーター64として送信された場合、エラー コードが返されnCountます。これは、この値が関数自体の実装に組み込まれていることを意味します。)

他の API の複数オブジェクトの待機関数を簡単に確認しても、2 つ以上のMAXIMUM_WAIT_OBJECTSアイテムを受け入れるものは他にありません。

したがって、あなたの質問に対する具体的な答えは次のとおりです。これを行う唯一の方法は、WinAPI の独自の置換を作成し、代わりに呼び出しを関数の呼び出しにWaitForMultipleObjects置き換えることです。(これは非常に大規模な作業であり、おそらく OTL で行われていない理由であり、ここでの回答で誰かがそれを行うことを期待するのはかなり非現実的です。)WaitForMultipleObjectsTOmniTaskGroup.WaitForAll

于 2012-12-24T19:42:11.683 に答える
2

関連する質問への回答(制限の根拠について) によると、 Winsock.pas および OtlThreadPool.pas の定義を変更することで、FD_SETSIZE制限回避できCMaxConcurrentWorkersます。好みの制限に設定してください。ただし、私は個人的にアドバイスを保証することはできません。

Winsock.pasを変更すると、アプリケーションで Delphi 提供のランタイム パッケージを使用できなくなることに注意してください。(自分でコンパイルしたパッケージを引き続き使用できます。組み込みパッケージと同じ名前にすることはできません。)

于 2012-12-19T05:11:31.880 に答える