Безопасно ли использовать дескриптор Windows, чтобы сделать вызовы DirectX из потока bgnd? - PullRequest
0 голосов
/ 08 апреля 2009

Я отлаживаю приложение, которое (в основном) представляет собой пользовательский интерфейс Winforms поверх неуправляемого кода. Немного кода UI не WinForms: он использует DirectX для рисования непосредственно на поверхности некоторых компонентов Panel. Чтобы сделать это, дескриптор окна компонента записывается после того, как он создан, и любые последующие вызовы, требующие дескриптора, который необходим модулю, выполняющему это отображение DirectX (например, GetWindowRect ()), используют этот дескриптор. Этот механизм существует уже некоторое время, не видя проблемы, которую я собираюсь описать, хотя, возможно, нам просто повезло. Программист, который поставил это на место, мне больше не доступен.

Проблема, которую я пытаюсь решить, заключается в том, что очень периодически изображение для этой области искажается. Эта процедура вызывается из фонового потока. Я видел в своем журнале приложений, что, например, вызов GetWindowRect () внезапно и одновременно с проблемой рисования вернет координаты мусора. Сам дескриптор окна не поврежден, и я уверен, что мы не перезаписали структуру данных Windows; Я могу остановить и перезапустить наш поток отображения, и GetWindowsRect (), используя тот же дескриптор Windows, снова начнет возвращать хорошие координаты.

Если бы это было на уровне .NET, я бы использовал Invoke, чтобы отложить отрисовку для основного потока. У меня вопрос, должны ли мы делать то же самое для этого вызова DirectX? Я пытался найти предупреждение Microsoft о том, чтобы не рисовать в фоновых потоках, чтобы напомнить себе, распространяется ли оно на использование дескрипторов Windows; Кто-нибудь может указать мне на это?

PC

1 Ответ

0 голосов
/ 08 апреля 2009

Оконные ручки имеют сходство с нитями .

Самый важный пользовательский интерфейс Элемент, конечно, окно. Объекты окна имеют сходство потоков. Поток, который создает окно тот, с которым у окна есть неразлучные отношения. Неформально, один говорит, что нить "владеет" окно. Сообщения отправляются на оконная процедура только в потоке который владеет им, и вообще говоря, изменения в окне должны быть сделано только из темы, которой принадлежит Это. Хотя оконный менеджер разрешает любому потоку доступ к таким вещи как свойства окна, стили, и другие атрибуты, такие как оконная процедура и такие доступы Поток безопасен из окна точка зрения менеджера, последовательности загрузки-изменения-записи должны обычно ограничивается владельцем нить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...