Как диспетчер задач узнает что приложение не отвечает?
========================================================

 Как диспетчер задач узнает что приложение не отвечает? 

 В Windows (с Vista) реализован механизм Обход Цепочки ожидания (Wait Chain Traversal (WCT)), который при помощи специализированных функций позволяет выявлять взаимоблокировки процессов, работающих в системе. Цепочка ожидания - это причинно-следственная связь между событиями в системе, которая представляет собой последовательность чередующихся пар потоков и событий, каждый поток сопровождается событием, которого он ждет, а это событие, в свою очередь, сопровождается следующим потоком в цепочке, которому оно принадлежит, и так далее. Под событием в данном контексте мы подразумеваем любой тип объекта синхронизации, мьютекс, критическую секцию, COM, LPC/RPC-ответ, сообщения и прочее. Поток ждет событие начиная с момента, когда он его запрашивает и заканчивая моментом, когда он им овладевает. Блокировка находится в собственности потока с момента получения её потоком и до момента, когда он её освобождает. Понятие "владение блокировкой" подразумевает блокировку, ожидающую когда поток-владелец её освободит. Таким образом, если поток А ожидает блокировку, которой владеет поток Б, то можно смело утверждать, что поток А ждет поток Б. WCT позволяет запросить цепочку ожидания для одного или нескольких потоков путем создания сессии через использование функций WCT, таких как OpenThreadWaitChainSession, GetThreadWaitChain, EnumProcesses и GetThreadWaitChain. 

 Приложение получает события из очереди, предоставленной Windows.  

Если приложение не опрашивает очередь событий в течение некоторого времени (5 секунд), например, при длительном вычислении, то Windows предполагает, что приложение зависло, и предупреждает пользователя.  

Чтобы избежать этого, приложения должны передавать "тяжелые" вычисления рабочим потокам или разделять обработку и обеспечивать регулярный опрос очереди.