2010-03-09 5 views
1

У меня есть приложение XNA, и мне нужно перенаправить входную очередь в пользовательский поток, вместо того чтобы иметь его доступным только в основном потоке. Есть ли альтернатива AttachThreadInput?Чтение ввода из вторичной нити

+0

На каком устройстве ввода и платформе вы ищете информацию? Клавиатура/мышь и Windows или геймпад и Xbox 360? – Venesectrix

+0

Клавиатура на Windows, это единственное, что вызывает проблемы ... –

ответ

1

Я сделал несколько попыток поиска по этому вопросу, и я не думаю, что вы найдете отличный способ решить эту проблему. Этот post указывает, что это может быть возможно, если вы «создадите новый класс ввода, зарегистрируете эти события в главном потоке моих игр, а затем запустите поток, чтобы начать опрос».

Общий консенсус этих двух потоков (в том числе тот, который вы начали на форумах XNA) указывает мне, что попытка отправить ввод с клавиатуры в другой поток, вероятно, не самая лучшая идея, и что, если возможно, основной поток должен просто обрабатывать ввод клавиатуры, а другой поток может считывать входные данные из общего хранилища основного потока. Альтернативой будет основной поток, сообщающий второму потоку выполнять определенные функции на основе того, какой вход он получил.

Keyboard access from other thread
Keyboard Input on Another Thread

+0

Один из этих потоков - это действительно мой (giuseppemag), я надеялся, что более широкая аудитория SO может что-то добавить :) –

0

Я не совсем уверен, что вы просите, но я постараюсь ответить.

Если вы пытаетесь создать многопользовательские игры на и хотите вход для каждого игрока должны быть обработаны с помощью резьбы, вы должны сделать следующее:

  • Создание объектов XNA, связанные с клавиатурой/мышь/Геймпады в главном потоке выполнения вашего приложения

  • Передайте объекты по ссылке на пользовательский ввод обработки нити.

Темы разделяемой памяти с процессами, которые порождают их, поэтому любые изменения, внесенные в объект внутри пользовательской нити будут автоматически доступны вне резьбы, используя свой объект ссылки.

Надеюсь, это поможет.

+0

Это не тот случай, я просто строю игра, в которой обновление и рендеринг являются фактически отдельными циклами: обновление выполняется в другом потоке, а чертеж остается в основном потоке. Мне нужно прочитать ввод внутри потока обновления, чтобы сравнить показания относительно итераций цикла обновления. Синхронизация входных данных из основного потока добавит столько накладных расходов, чтобы полностью одолеть прирост производительности двух потоков ... –