В потоках WaitForMultipleObjects никогда не возвращается, если установлено значение INFINITE - PullRequest
1 голос
/ 09 июня 2010

Допустим, у меня есть три дескриптора потока

HandleList[0] = hThread1;
HandleList[1] = hThread2;
HandleList[2] = hThread3;
/*All the above are of type HANDLE*/

Прежде чем закрыть приложение, я хочу, чтобы поток выполнил свою задачу.Поэтому я хочу заставить приложение ждать, пока поток не завершится.

Итак, я делаю,

WaitForMultipleObjects(3, HandleList, TRUE, INFINITE );

Таким образом, я могу создать поток, выполнить его задачу.Но элемент управления никогда не перемещается на следующую строку после вызова WaitForMultileObjects, независимо от того, завершает ли его задача весь поток.

Если я использую несколько секунд вместо INFINITE, то через несколько секунд он переходит к следующей строке, независимо от того, является ли потокзавершает свою задачу или нет.

WaitForMultipleObjects(3, HandleList, TRUE, 10000 );

Моя проблема здесь в том, что я не могу идти в течение нескольких секунд, так как я не уверен, завершат ли потоки свою задачу за заданное время.

Чтобы перечислить мою проблему простыми словами, я хочу, чтобы все мои темы завершили задачу, прежде чем я закрою свое приложение.Как я могу добиться этого с помощью API WaitForMultipleObjects?

РЕДАКТИРОВАТЬ: Согласно MSDN ..

dwMilliseconds [in] Интервал времени ожидания, вмиллисекунды.

  • Функция возвращает значение по истечении интервала, даже если условия, заданные параметром bWaitAll, не выполняются.
  • Если dwMilliseconds равен нулю, функция проверяет состояния указанных объектов и немедленно возвращает результат.
  • Если значение dwMilliseconds равно БЕСКОНЕЧНО, интервал ожидания функции никогда не истекает .

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

Вы должны сообщить всем своим потокам, чтобы закончить работу с SetEvent или чем-либо еще. И будь уверен, что не дождешься сам.

2 голосов
/ 09 июня 2010

Простой ответ заключается в том, что вы не можете достичь этого с помощью WaitForMultipleObjects.

Проблема здесь в том, что ошибка не в этой функции, она делает точно предполагается, что он ожидает завершения потоков.

Проблема здесь в том, что один или несколько потоков никогда не завершают .

И что - это проблема, которую вам нужно решить.Почему потоки не заканчиваются?

Они заблокированы?Они работают в цикле, из которого они не вырываются?

2 голосов
/ 09 июня 2010

В вашем коде вы говорите:

WaitForMultipleObjects(3, HandleList, TRUE, INFINITE );

, который будет ожидать завершения всех трех потоков.Это то, что вы хотите?Если вы хотите подождать, пока какой-либо из них не будет завершен, вам нужно:

WaitForMultipleObjects(3, HandleList, FALSE, INFINITE );

Если первая версия никогда не возвращается, то это потому, что по крайней мере один из потоков никогда не завершается.Возможно, вы захотите взглянуть на условия для потоков, которые создают окна в документах API: http://msdn.microsoft.com/en-us/library/ms687025%28VS.85%29.aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...