Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› WaitForDebugEvent(&de, 0)
Посл.ответ Сообщение


Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 19 февраля 2007 07:20
· Личное сообщение · #1

Хочу сделать в потоке обработку DebugEvents и запросов от клиента - Run, HandleException и т.д.
Поэтому для скорости необходимо просто проверять очередь DebugEvents. Делаю так:

WaitForDebugEvent(&de, 0);

Но как понять, когда ф-я вытаскивает из очереди DebugEvents очередное событие, а когда нет? Сама она всегда возвращает 1. Если написать самый примитивный цикл обработки и вместо INFINITE написать 0:

if (!WaitForDebugEvent(&de, 0))
{
Sleep (0);
continue;
}

Все равно возвращается 1 и проц грузится на 100% и жутко тормозит, т.к. все проц. время тратится на _пустую_ обработку. Так как мне узнать когда процесс ожидает Debug-обработки?




Ранг: 66.1 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 19 февраля 2007 07:34
· Личное сообщение · #2

Эта функция не выполнится пока не возникнет отладочное исключение:

bool DebugLoop=true;
DWORD Continue;
DEBUG_EVENT dbg_event;

while(DebugLoop) {
WaitForDebugEvent(&dbg_event, INFINITE);

switch(dbg_event.dwDebugEventCode) {

case(CREATE_PROCESS_DEBUG_EVENT): {
...
Continue = DBG_CONTINUE;
break;
}


case(EXIT_PROCESS_DEBUG_EVENT): {
Continue = DBG_CONTINUE;
DebugLoop = false;
ContinueDebugEvent(dbg_event.dwProcessId, dbg_event.dwThreadId, DBG_CONTINUE);
break;
}

default: {
Continue = DBG_CONTINUE;
break;
}

ContinueDebugEvent(dbg_event.dwProcessId, dbg_event.dwThreadId, DBG_CONTINUE);
}




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 19 февраля 2007 08:04
· Личное сообщение · #3

Да я понимаю, что с флагом INFINITE ф-я не вернет управление, пока не возникнет исключение/сообщение!
Но мне нельзя дожидаться возврата, т.к. может возникнуть запрос, кот. необходимо обработать как можно быстрее. И нужно что-то типа TryEnterCriticalSection, только для DebugAPI...




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 19 февраля 2007 10:53
· Личное сообщение · #4

Решение нашлось! =)
Во-первых, по-настоящему WaitForDebugEvent(&de, 0) возвращает 0, если отладочных сообщений нет.
Во-вторых, подвисала прога из-за высокого приоритета потока. Изменив на THREAD_PRIORITY_LOWEST, поток перестал тормозить отлаживаемое приложение.
И в-третьих Sleep(0) меняем на Sleep(1), чтобы проц мог простаивать


 eXeL@B —› Программирование —› WaitForDebugEvent(&de, 0)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати