Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373

GetMessageW зависает

25.12.2023, 12:25. Показов 808. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Имеется большая программа на WPF. Проблема в том, что если параллельно запущена игра в окне на UE4, то программа WPF в рандомный момент может зависнуть. Отладка показывает, что зависает она на вызове IntGetMessageW - нативной функции user32.dll.

Кто-нибудь с подобным сталкивался? Как эту проблему решить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2023, 12:25
Ответы с готовыми решениями:

Корректный выход из цикла GetMessageW
Есть библиотека, которая при внедрении в процесс создаёт новый поток, устанавливает SetWindowsHookEx на события WH_MOUSE и переходит к...

Пк зависает в определенной игре, комплектующие новые. ТРР и зависает намертво
Здравствуйте Форумчане, пришел на форум не от легкой жизни. Нужна Ваша помощь. Собрал пк сам. Установил Win10 x64. Комп виснет при...

Windows 7 намертво зависает, потом отвисает (зависает физическая память)
Здравствуйте. Есть проблема, ОС переодический внезапно зависает. Чем это вызвано я не понял, но чаще всего зависание происходит если...

5
16 / 17 / 0
Регистрация: 12.01.2022
Сообщений: 141
25.12.2023, 15:58
Там много вариантво почему виснуть может. Покажи код или приложение не твое?
1
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
25.12.2023, 16:36  [ТС]
Приложение моё, кода в нём очень-очень много, но фокус в том, что виснет оно вне моего кода. Просто диспатчер берёт и зависает. Я везде где надо использую Dispatcher.BeginInvoke и не жду завершения, т.е. это точно не мой код. Виснет оно только если параллельно запущена игра на UE4. Если запустить сам UE4 - зависания нет.

Вот стек:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    ntdll.dll!_NtWaitForSingleObject@12()
    KERNELBASE.dll!WaitForSingleObjectEx()
    WindowsBase.ni.dll!65665d4a()
    [Указанные ниже кадры могут быть неверны или отсутствовать; отладчик машинного кода пытается пройти по стеку управляемых вызовов] 
    WindowsBase.ni.dll!65665d35()
    [Переход от управляемого кода к машинному]   
>   WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) Строка 4758 C#
    WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) Строка 1750    C#
    WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) Строка 1718 C#
    WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame) Строка 550  C#
    PresentationFramework.dll!System.Windows.Application.RunDispatcher(object ignore)   
    PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window)  
    PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window)
    PresentationFramework.dll!System.Windows.Application.Run()
    Tesseract.exe!SkyChroma.App.Main()  
    [Переход от машинного кода к управляемому]   
    mscoreei.dll!__CorExeMain@0()   Нет данных
    mscoree.dll!_ShellShim__CorExeMain@0()
    mscoree.dll!__CorExeMain_Exported@0()   
    ntdll.dll!___RtlUserThreadStart@8() 
    ntdll.dll!__RtlUserThreadStart@8()
Тут ещё нюанс: сборка мусора после зависания тоже перестаёт происходить. Если когда приложение WPF уже зависло нажать паузу в студии - она тоже зависнет. Чтобы получить этот стек, я сделал дамп памяти через диспетчер задач и открыл его - только тогда увидел где проблема.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
25.12.2023, 21:12
Цитата Сообщение от VBDUnit Посмотреть сообщение
Я везде где надо использую Dispatcher.BeginInvoke и не жду завершения, т.е. это точно не мой код.
C#
1
Dispatcher.BeginInvoke(new Action(() => { while(true) { Thread.Sleep(1000); } }));
Если такой код выполнить в вашей программе тоже не зависнет? BeginInvoke ведь. Зависание невозможно.
1
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
25.12.2023, 21:22  [ТС]
Тогда при отладке главного потока я бы попадал прямиком в этот цикл. А я попадаю в GetMessageW, который кого-то (или чего-то?) ждёт. Очень редко спустя где-то минуту ловится деадлок:
C#
1
2
ContextSwitchDeadlock" 
  Сообщение = Помощник по отладке управляемого кода "ContextSwitchDeadlock" : "CLR не удалось перейти из COM-контекста 0x390901b8 в COM-контекст 0x39090100 за 60 секунд. Наиболее вероятно, что поток, владеющий контекстом/апартаментом назначения, находится в режиме ожидания или выполнения очень длительной операции без прокачки сообщений Windows. Обычно эта ситуация отрицательно влияет на производительность и даже может привести к зависанию приложения или чрезмерному расходованию памяти. Чтобы избежать этой проблемы, все потоки однопоточного апартамента (STA) должны использовать примитивы ожидания для прокачки (например, CoWaitForMultipleHandles) и периодически прокачивать сообщения во время длительных операций.
Фокус в том, что если нажать паузу - студия тоже зависает, пока не вылезет вот это вот. Или не вылезет. Я поискал подобные проблемы у других людей, нашёл похожее при комбинации WPF и UWP: https://github.com/dotnet/wpf/issues/8347, и оно решается хуком. Поставил такой хук - не помогло. Я даже понять не могу, чего он ждёт вообще. UE4-приложение при этом не виснет.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
26.12.2023, 15:36
VBDUnit, тут нужно поподробнее что имеется ввиду под "комбинацией" приложений.
Так или иначе, все указывает на то что ваш код вызывает что то что блокирует цикл обработки сообщений и нужен MRE чтобы понять что именно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2023, 15:36
Помогаю со студенческими работами здесь

Комп зависает с звуковым статтером, а после обычной перезагрузки - зависает на определении памяти
Вообщем, у меня есть довольно сложная проблема и я не могу выявить решение. При запуске и инициализации биоса, именно после перезагрузки -...

Через 5 минут после запуска игры компьютер зависает, на экране появляется цветные линии, картинка зависает.
(зависает компьютер ,когда запускаешь игру в течении 5 минут на экране появляется цветные линии и картинка виснет)Видеокарта G-forse 9600GT...

комп зависает намертво при работе с новым винчестером, после перезагрузки компа зависает при загрузке BIOS
купил новый винчестер. комп стал зависать намертво. при перезагрузке, зависает уже при загрузке на заставке выбора выхода в BIOS (Press DEL...

У меня зависает комп, этот же комп не зависает почему то у соседа
Всем привет. Подскажите плиз. Зависает компьютер на мёртво(даже capslok) перестаёт работать, после минут 5 работы. Сосед слегка...

зависает.
Program KurRab; Uses Crt, Graph; Type strmenu=record x: integer; s: string; end; Const kol=4; mas:array of strmenu=


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru