хук это как коллбек(т.е. перехват/реакция/обработка какого-либо "события", например функция какаято вызвалась и ты это перехватил и чето там делаешь) только насильно установленный а не официально зарегистрированный. ты уверен что ты правильно это слово используешь?
когда тред "завис" это значит он не делает нужной работы - т.е. либо ждёт внешних каких-то оповещений(дедлок), либо делает очень много(или бесконечно много) какойто работы на каком-то этапе и не доходит до другой работы(например бесконечный цикл где-то). в любом случае смотри стактрейс мейн треда(процесс хакером например) и дебажь дальше оттуда.
а так вообще любое взаимодействие с игрой должно быть как правило исключительно из мейн треда(т.е. надо хукать чтото что каждый кадр/тик вызывается и оттуда работать с игрой) из соображений синхронизации с игровой логикой(надо свою логику встраивать в правильные моменты игровой логики и уважать оригинальный порядок игровой логики, например не надо трогать вещи параллельно(на другом ядре процессора) с тем как игра их удаляет обновляет и т.д.). если ты не из мейн треда приказы отправляешь то наверно следует перестать это делать.
ну и код в студию
Спасибо за ответ, я реально кст хукнул PrepareUnitOrders и вызывал свой хук в котором вызывал ориг функцию. Сейчас просто вызываю ориг функцию напрямую.
Хукнул Present и попробовал обрабатывать нажатия клавиш уже в нем и теперь никаких проблем, крашей не наблюдаю.
Большое спасибо.
В момент зависания попробовал посмотреть стактрейс мейн треда и заметил
0, ntdll.dll!NtWaitForAlertByThreadId+0x14
1, ntdll.dll!RtlWaitOnAddress+0x44d
2, ntdll.dll!RtlWaitOnAddress+0x302
3, ntdll.dll!RtlWaitOnAddress+0x11d
4, ntdll.dll!RtlEnterCriticalSection+0x214
5, ntdll.dll!RtlEnterCriticalSection+0x42
6, tier0.dll!CThreadMutex::LockForWrite+0x1e
дедлок ?
консоль доты(visual studio debug)
CSwapChainBase::QueuePresentAndWait() looped for 31 iterations without a present event.
Excessive frame time of 348.56ms clamped. Acting as if the frame only took 100.00ms. (Last amnesty was 'SDL_EVENT(0x20e)', 3.56s ago)
CSwapChainBase::QueuePresentAndWait() looped for 42 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 43 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 44 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 45 iterations without a present event.
CSwapChainBase::QueuePresentAndWait() looped for 46 iterations without a present event.
Hitch alert: Present was waiting for 47 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 47 iterations without a present event.
Hitch alert: Present was waiting for 48 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 48 iterations without a present event.
Hitch alert: Present was waiting for 49 iterations and 0.5 seconds.
CSwapChainBase::QueuePresentAndWait() looped for 49 iterations without a present event.
......