2009-12-09 2 views
0

это мой вопрос ... Существует способ проверить, когда приложение прошло полноэкранный режим в DXGI (DX10/11). Для перехода на полноэкранный режим я имею в виду, что система ЗАВЕРШЕНО сменой режима. Потому что мне нужно это для моего приложения, чтобы предотвратить тупик и настроить время. (У меня многопоточный движок, а Present не находится в потоке сообщения сообщения, вызывающего тупик при изменении режима в случайном порядке)) На самом деле я заставляю его ждать 1 секунду, продолжая обрабатывать сообщения в потоке сообщений, и это работает, но я хочу что-то больше DETERMINISTIC, который говорит мне «эй, смена режима завершена, теперь вы в полноэкранном режиме». : DПроверьте, прошло ли приложение в полноэкранном режиме. (DXGI/DirectX10)

Есть идеи?

ответ

1

Есть ли причина, по которой вы не можете запускать потоки рендеринга и потока сообщений как одну и ту же резьбу?

В соответствии с документами ничего не говорится о том, что изменение завершено.

Странно, однако, DXGI полагается на получение ответов от внутренних вызовов SendMessage (которые происходят через насос сообщений в многопоточной среде). Поэтому я не вижу, как задерживает ваш насос сообщений, устраняет проблемы. Все, что он сделает, это заставить DXGI ждать дополнительную секунду, прежде чем продолжать делать свои вещи. Замкнутый замок обычно подразумевает, что вы делаете то, что заставляет насос сообщений блокировать ожидание потока рендеринга.

+0

Я не могу запускать их в одном потоке, поскольку я разрешаю возможность для нескольких движков и потоков для каждого движка (один из них - поток ничьей (кстати, отлично работает в режиме DX9)). Похоже, что если я жду, когда смена режима будет завершена, DXGI больше не будет в тупике. (для wait, я все еще обрабатываю сообщения и делаю фальшивый подарок с активным флажком теста на секунду или так) – feal87

+0

Я тем временем нашел еще одно временное решение проблемы. Планировщик задач ждет завершения всех дочерних потоков, прежде чем продолжить свою работу. Ожидание выполняется с использованием WaitHandles и вызова WaitAll(). Я накладываю тайм-аут в 1 секунду на этот вызов, если сбой вызова (1 секунда передается), он обрабатывает все сообщения Windows и затем перезапускает ожидание. (таким образом все работает отлично) – feal87

Смежные вопросы