0MQ windows GUI лучшая практика - PullRequest
2 голосов
/ 20 января 2012

У меня довольно простой вопрос / проблема.Я хочу использовать 0MQ для некоторых довольно простых функций Pub / sub.Мое приложение подписчика - это приложение на основе графического интерфейса пользователя Windows, использующее простые формы win.

Поскольку в 0MQ, похоже, нет явной ссылки для обработки этого сценария, я предполагаю, что в худшем случае мне придется использовать BeginInvoke (...) в потоке графического интерфейса Windows, как только поток 0MQ получил любое сообщение подписки.Это кажется довольно простым, но если у кого-то есть какие-то идеи / мнения / соображения относительно лучшего способа справиться с этим, я очень ценю это.

Заранее спасибо Дэвид

Ответы [ 2 ]

1 голос
/ 15 февраля 2013

Как уже указывалось, есть несколько способов подключить ZeroMq к приложению WinForms.Это действительно не сильно отличается от использования ZeroMq и C # в других настройках, как в консольном приложении.Основное различие заключается в том, что вы указываете на то, что вы должны помещать сообщения в поток Gui, чтобы обновить элементы управления Gui.

Пример использования отдельного потока + очереди (шаблон производитель / потребитель) может бытьможно найти здесь: Примеры zeromq pub / sub с C # winform

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

Все решения имеют свои плюсы и минусы, все зависит от того, как выглядит ваша конкретная проблемная область.В целом, интеграция ZeroMq в приложение на C #, будь то WinForms или другое, является IMO довольно простой.Оболочка clrzmq хорошо написана и проста в использовании.Проблемы, с которыми вы можете столкнуться, в большей степени связаны с ограниченной обратной связью по ошибкам в самом ZeroMq.Если вы столкнетесь со странными сбоями;попробуйте запустить ту же логику в консольном приложении, что даст вам лучшие сообщения об ошибках.

1 голос
/ 13 февраля 2013

Для вашего подписчика ZeroMQ в приложении WinForms у вас есть по крайней мере несколько вариантов:

  1. Используйте фоновый рабочий поток для получения вашего сообщения 0MQ. Когда вы получите сообщение, передайте его фоновому рабочему progressChanged, чтобы обновить ваш пользовательский интерфейс.
  2. Используйте системный поток для получения сообщения и вызова для обновления вашего пользовательского интерфейса.
  3. В другом предложении по SO также предлагается использовать системный поток для постановки сообщения в очередь при получении и событие таймера для удаления сообщения из очереди. Если бы вы использовали Forms Timer, вы могли бы обновить пользовательский интерфейс, не вызывая его, или, если System Timer, вам нужно было бы вызвать.

Какой метод вы выберете, зависит от ваших критериев проектирования.

...