2013-01-22 2 views
1

Следующий вопрос касается движка игры единства, но он может относиться к любой программе, пытающейся отправить данные в основной поток, такой как поток пользовательского интерфейса.Interthread communication

Я обрабатываю некоторые данные по отдельному потоку (данные позиции асинхронно считываются из сокета). Однако мне нужно воздействовать на эти данные в основном потоке (преобразование игрового объекта можно получить только из основного потока). Подход, который я имею в виду, - создать потокобезопасную очередь и следовать шаблону производителя-потребителя. Поток будет помещать в очередь данные позиции, а основной поток будет декомпрессировать данные и действовать на них. * Примечание. В Unity у меня нет доступа к пространству имен System.Windows.Threading, поэтому я не могу использовать Dispatcher. Кроме того, он требует .Net 3.5, поэтому я не могу использовать пространство имен Collections.Concurrent.

Есть ли лучший подход?

Если нет, то как лучше всего сообщить основной поток, когда данные поставлены в очередь? Это кажется неэффективным для опроса, но я не могу думать ни о чем его.

Заранее спасибо.

+0

Тег единства предназначен для Microsoft Unity. Пожалуйста, не злоупотребляйте им. –

ответ

1

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

Как бы вы имитировали прерывания в многопоточной компьютерной программе высокого уровня? Трудно сказать - ваша нить, которая изменится, должна будет уведомить поток пользовательского интерфейса «Эй, я готов», а не постоянный контроль потока пользовательского интерфейса. Это требует некоторого рода передачи сообщений, на самом деле - это может оказаться невозможным.

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

0

Может быть, у this question есть ответ для вас.

Однако опрос очереди является более чистым решением IMHO, и не так дорого, если все сделано правильно, и в Интернете есть множество примеров.