Это не прямой ответ на ваш вопрос, но что-то, с чем я недавно столкнулся, на какое-то время поставило меня (и пару коллег) в тупик.
Это было прерывистое зависание потока, связанное с критическимраздел и, как только мы узнали причину, это было очень очевидно и подарило всем нам момент «д'о».Тем не менее, потребовалась серьезная охота, чтобы найти (добавив все больше и больше журналов трассировки, чтобы точно определить ошибочное утверждение), и именно поэтому я подумал, что упомяну это.
Это также было в критической секции enter.Другой поток действительно получил этот критический раздел.По-видимому, причиной этого была не заблокированная блокировка, поскольку в ней был задействован только один критический раздел, поэтому проблем с получением блокировок в другом порядке не могло быть.Поток, содержащий критическую секцию, должен был просто продолжить, а затем снять блокировку, позволяя другому потоку получить ее.
В итоге оказалось, что поток, удерживающий блокировку, в конечном итоге получает доступ к ItemIndex объекта (IIRC) комбобокс, довольно безобидный, казалось бы.К сожалению, получение этого ItemIndex зависит от обработки сообщений.И поток, ожидающий блокировки, был основным потоком приложения ... (на всякий случай, если кто-то задается вопросом: основной поток выполняет всю обработку сообщений ...)
Мы могли бы подумать об этом намного раньше, если быс самого начала было немного более очевидно, что vcl был вовлечен.Однако это началось с кода, не относящегося к пользовательскому интерфейсу, и участие vcl стало очевидным только после добавления инструментария (трассировка входа-выхода) вдоль дерева вызовов и обратно через все инициируемые события и их обработчики до кода пользовательского интерфейса.
Просто надеюсь, что эта история поможет кому-то, кто столкнулся с загадочным зависанием.