Если у меня есть приложение, которое создает потоки, которые выполняют свою работу, а затем выходят, и один или несколько потоков попадают в тупик (возможно, не по моей вине!), Есть ли способ программно заставить один из потоков продвинуться мимо WaitForSingleObject, в котором он мог застрять, и, таким образом, разрешить тупик?
Я не обязательно хочу прерывать поток, я просто хочу, чтобы он продолжил работу (и, таким образом, разрешил потокам завершиться «изящно».
(да, я знаю, что это похоже на дубликат моего предыдущего вопроса Delphi 2006 - Какой лучший способ изящно убить поток и по-прежнему активировать обработчик OnTerminate?, но ситуация немного иная - я спрашиваю здесь в том, можно ли заставить WaitForSingleObject (Handle, INFINTE)
вести себя как WaitForSingleObject (Handle, ItCantPossiblyBeWorkingProperlyAfterThisLong)
).
Пожалуйста, будь со мной нежнее.
* ПОДРОБНЕЕ *
Проблема не обязательно в коде, исходный код которого у меня есть. Фактическая ситуация - это библиотека последовательного COM-порта (AsyncFree), основанная на потоках. Когда порт основан на USB, кажется, что библиотека находится в тупике между двумя потоками, которые она создает при закрытии порта. Я уже подробно обсуждал это на этом форуме. Я действительно перекодировал один из вызовов WaitForSingleObject, чтобы он не был бесконечным, и это вылечило эту тупиковую ситуацию, но затем другой вызов появился позже в последовательности завершения потока, на этот раз в подпрограмме Delphi TThread.Destroy.
Поэтому мое объяснение этому простое: когда мои потоки блокируются, я исправляю код, если могу. Если я не могу или появляется одна, о которой я не знаю, я просто хочу, чтобы цепочка закончилась. Мне не обязательно быть красивой. Я не могу позволить себе подавить мое приложение.
WaitForSingleObject
на not быть бесконечным? - person Jon Skeet   schedule 18.12.2011