2016-10-31 14 views
3

私はWINAPI ThreadPoolを閉じることについて質問があります。WINAPIを正しく閉じる方法スレッドプールを保留中のタスクをキャンセルする

私は、クリーンアップグループを持つスレッドプールを初期化し、SubmitThreadpoolWorkを使用してスレッドプールにいくつかのタスクをプッシュしたとします。 タスクのコールバック関数でCloseThreadPoolTask​​を呼び出しています。

現在、実行中のタスクとスレッドプールのキューに保留中のタスクがあります。 私はCloseThreadpoolCleanupGroupMembers関数を使用して、キューに入れられたタスクが完了するまで待たずに、を使用したいと思っていますが、依然として保留中のタスクのコールバックを取得して、タスクのパラメータ)。 Cancelling scheduled work/io/timer items in WIN32 thread pool

私はクリーンアップグループ(PTP_CLEANUP_GROUP_CANCEL_CALLBACK)に合格したコールバックはまた、彼らはまだ中にクリーンアップグループに結び付けられているため、現在(実行されているオブジェクトを作業するために呼び出すこと:私はこのスレッドで見た

実行) - 明らかに私はそれが起こることを望んでいません...クリーンアップキャンセルコールバックが現在実行中のタスクで呼び出されない方法はありますか?

ありがとうございます!

答えて

0

CreateThreadpoolWorkのコールバックが実行されると、それに対するクリーンアップコールバックは呼び出されません。またはアイテムのキャンセルコールバックが呼び出された場合 - PTP_WORK_CALLBACKはこのアイテムの前と後には呼び出されません。ここには本当に問題はありません。 PTP_WORK_CALLBACKと呼ばれるか、このアイテムのキャンセルコールバックと呼ばれます。これは相互に排他的です。非常に重大なエラーを含むトピックCancelling scheduled work/io/timer items in WIN32 thread poolに返信してください。テストインサートMessageBoxのご依頼は、PTP_WORK_CALLBACKの開始で、MessageBoxの場合はCloseThreadpoolCleanupGroupMembersの前にお電話ください。 PTP_WORK_CALLBACKが実行を開始したかどうかを確認することができます。このアイテムのコールバックコールはすでに呼び出されていません。

+0

お返事ありがとうございました! 私はあなたが言ったことに従ってこの事をテストしました。私は明確にする別のポイントがあります。 1つのスレッドでプールを使用し、1分間スリープする5つのタスクをプッシュしました。 CloseThreadpoolCleanupGroupMembersを呼び出した後、スレッドが終了した後にのみクリーンアップの取り消しコールバックが呼び出されました とその作業は4回だけ呼び出されました(保留中のジョブの場合のみ) – sborpo

関連する問題