GUI подход к реализации в C # и .NET - PullRequest
0 голосов
/ 29 сентября 2010

Я полный новичок в C # и .NET.
Я должен реализовать графический интерфейс для внутреннего процесса в C #.
Дизайн, которому я должен следовать, - это иметь сетку данных дляотображать данные, и когда пользователи нажимают на строки, появляются другие представления. Например, график данных.
Управление графическим интерфейсом осуществляется процессом, например, ProcessA.Другой процесс, например ProcessB, выполняющий обработку и соединение с удаленными службами, генерирует данные, которые должны отображаться в графическом интерфейсе.
ProcessB и ProcessA обмениваются данными через общую память.Т.е. ProcessB обновляет совместно используемую память, а ProcessB, когда видит обновление (через «грязные биты»), обновляет соответствующую строку данных в сетке.
Мои вопросы:

  1. .обычный подход для графического интерфейса в .NET и такие сценарии?Я спрашиваю, потому что лично мне это совсем не нравится, и мне было интересно, не прав ли я, что мне это не нравится.

  2. Есть ли лучший дизайн для этого, если требуется действительно быстрое обновление графического интерфейса?Например, должны ли ProcessA и ProcessB быть только одним процессом?

  3. возможно ли реализовать этот проект в C #?Т.е. обновить сетку данных через разделяемую память?Потому что я немного погуглил, и кажется, что большинство уроков описывают, что сетка данных привязана к источнику данных (для доступа к БД или чтения XML-файла)

  4. В C # графический интерфейс полностью обновлент.е. он полностью перерисовывается при каждом обновлении строки?В этом случае использование грязных битов, чтобы узнать, какая часть общей памяти была обновлена, чтобы обновить соответствующую часть графического интерфейса, бесполезно?

  5. Можно ли создать графический интерфейс таким образом, чтобы он автоматически обновлялся при каждом изменении общей памяти?

ОБНОВЛЕНИЕ: ProcessA и ProcessB находятся на одном компьютере

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 сентября 2010
  1. Вы можете использовать EventWaitHandle для передачи сигналов между процессами или использовать WCF.Отправка данных между процессами через разделяемую память, безусловно, является самым быстрым способом, но WCF, возможно, лучше.(Для проверки скорости мой пост в блоге )
  2. Если вы можете использовать их в одном и том же процессе, это может быть хорошей идеей, и просто иметь отдельные темы
  3. Да и нет,Вы можете передавать данные через разделяемую память (используя файлы отображения памяти), а затем вам нужно десериализовать данные в управляемый объект, который может быть связан с сеткой данных.С другой стороны, вы можете создать читатель / список поверх отображенного в памяти файла, который считывает и десериализует один элемент за раз, когда они связаны с сеткой.
  4. Если вы можете определить, какие данные изменились иТолько обновите эту часть графического интерфейса, это хороший подход.Если вы используете грязные биты в совместно используемой памяти или открываете более богатый уровень обслуживания в WCF с дуплексным связыванием, у которого есть методы обратного вызова для разных данных, это скорее вариант проектирования.Сервер сообщает, какая часть изменилась, клиент принимает сигнал и обновляет соответственно.

В целом, подход клиент / сервер с определенным интерфейсом и методами создает более чистый код, и вы знаете, что каждая частьделает.Использование разделяемой памяти и, например, сигнализации создает более тесную связь, и чтение кода не сразу скажет вам, что происходит, поскольку это более сложно (по моему личному мнению).Тем не менее, если скорость максимальна, а я имею в виду первостепенную важность, используйте разделяемую память.Если нет, перейдите к привязке WCF и именованных каналов с двусторонним сервисным контрактом.Это чистый и многоразовый.

0 голосов
/ 29 сентября 2010

Под процессом вы подразумеваете нить? Или мы говорим о графическом интерфейсе и службе Windows?

Если вы используете многопоточность, с общей памятью все в порядке. Если они являются реальными процессами, то «правильный» способ - создать службу WCF по именованным каналам для межпроцессного взаимодействия на компьютере. (Это также облегчает перемещение процессов с машины). Таким образом, вы можете использовать дуплексную (двухстороннюю) привязку WCF для обновления графического интерфейса пользователя при изменении данных.

По звукам вещей вам нужны потоки больше, чем процессы. В .NET есть класс BackgroundWorker, который разработан именно для такого рода сценариев. Главное, на что нужно обратить внимание, это то, что если вам нужно обновить графический интерфейс из фонового потока, вам нужно использовать диспетчер потоков Gui. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

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

0 голосов
/ 29 сентября 2010
  1. использование GUI для общения со службой WCF довольно распространено. если это то, что вы подразумеваете под ProcessA и ProcessB.
  2. вы можете использовать один процесс, но у вас уже есть требования ...
  3. вы можете обновить ArrayList или что-то подобное, а затем использовать его в качестве источника данных
  4. нет, я так не думаю
  5. ну, вы должны точно понять, когда происходит обновление, и создать для этого событие. таким образом, ваш источник данных будет обновлен, как и ваша сетка данных
...