// отладчик прореагирует на сообщения или другую обработку, он будет
// немедленно прерван. Однако, если он просто простаивает в цикле
// сообщений, необходимо вынудить его к действию.
// Поскольку имеется идентификатор (ID) потока, будем просто посылать
// потоку сообщение WM_NULL. Предполагается, что это простенькое
// сообщение, так что оно не должно испортить подчиненный отладчик.
// Если поток не имеет очереди сообщений, эта функция просто потерпит
// неудачу для такого потока, не причинив никакого вреда,
for ( i = m_vDbgThreads.begin () ;
i!= m_vDbgThreads.end () ;
i++ )
{
// Пусть этот поток продолжит выполнение
//до очередной точки прерывания
. DBG_ResumeThread ( i->ro_hThread);
PostThreadMessage ( i->m_dwTID, WM_NULL, 0, 0);
}
// Теперь понизить приоритет до старого значения.
SetThreadPriority ( hThisThread, iOldPriority);
}
Для того чтобы остановить подчиненный отладчик, нужно умудриться "втиснуть" точку прерывания в поток команд CPU так, чтобы можно было останавливаться в отладчике. Если поток выполняется, то подобраться к известной точке можно при помощи API-функции suspendThread, приостанавливающей его. Затем, вызвав API-функцию GetThreadContext, определить указатель текущей команды. Имея такой указатель, можно вернуться к установке простых точек прерывания. Установив точку прерывания, нужно вызвать API-функцию ResumeThread, чтобы разрешить потоку продолжать выполнение и сделать так, чтобы он натолкнулся на эту точку.
Хотя вмешаться в отладчик довольно просто, нужно подумать еще о паре проблем. Первая состоит в том, что ваша точка прерывания может не сработать. Если подчиненный отладчик обрабатывает сообщение или делает некоторую другую работу, он будет прерван. Однако, если подчиненный отладчик, находясь в таком состоянии, ожидает прибытия сообщения, точка прерывания не будет срабатывать, пока подчиненный отладчик не получит сообщение.