графический интерфейс для мониторинга тысяч потоков - PullRequest
1 голос
/ 06 апреля 2011

В академических целях я реализовал библиотеку C #, которая реализует «вычисления с агентами», например, думая о том, что делает JADE.С помощью этой библиотеки я могу легко реализовать алгоритм распределенных вычислений.Каждый агент - это объект, имеющий отдельный поток, реализующий часть вычислений, а сам объект остается свободным для получения и отправки сообщений.Эти алгоритмы могут запускать тысячи агентов (то есть потоков), контролируемых супер-агентом, который изменяет их состояние и синхронизирует их: я не могу создать 10.000 потоков и позволить им работать всем вместе, потому что ПК может умереть ...Таким образом, каждый агент имеет изменяющийся статус, который я должен нарисовать в графическом интерфейсе, чтобы позволить пользователю понять, что происходит во время вычислений.И мои агенты могут быть созданы и убиты во время вычислений, что усложняет процесс ...Я думал использовать сетку, в которой каждая ячейка является агентом, меняя цвет фона каждой ячейки в соответствии со статусом агента, но я не уверен, как «присоединить» один агент к ячейке (помните, что я не могу использовать индекс, потому чточисло агентов может меняться, и некоторые агенты могут быть уничтожены, я думал создать элемент управления для каждого нового агента и поместить этот элемент управления в графический интерфейс, чтобы я мог быстро создавать, размещать и уничтожать его при необходимости.Большое дело в огромном количестве потоков и необходимости как можно быстрее обновлять графический интерфейс, потому что состояние потоков меняется непрерывно и очень быстро.Что ты можешь предложить?Как лучше всего выполнить мою задачу?

ОБНОВЛЕНИЕ: Я занимаюсь разработкой этой библиотеки с использованием Framework 2.0, поскольку она ДОЛЖНА работать и под Linux, используя Mono.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2011

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

edit: на самом деле вы даже можете избавиться от hashmap и просто иметь массив, потому что максимальное количество потоков, которое вы можете иметь, довольно мало (<2 ^ 16), я думаю. Это также избавит от разногласий, поскольку вы можете заблокировать отдельные элементы массива вместо всей хэш-карты. </p>

edit2: На самом деле мне пришло в голову, что вы можете избавиться от всего. Просто имейте общую поверхность 256x256 пикселей (то есть 2 ^ 16 пикселей). Каждый пиксель принадлежит потоку, идентификатор потока которого равен индексу пикселя. Таким образом, каждый поток получает доступ только к своему пикселю. Затем создайте пользовательский элемент управления, и метод OnPaint переместит общую поверхность на графическую поверхность.

0 голосов
/ 06 апреля 2011

Я бы не стал делать это в .NET чисто, потому что farmewok почти не достаточно мощный для этого.Используйте MFC или лучше Direct3D или, если вам нужна поддержка Linux, OpenGL.Это может быть накладные расходы, но вы определенно не столкнетесь с проблемами обновления (по крайней мере, не в графическом интерфейсе)

0 голосов
/ 06 апреля 2011

Я бы сделал это с помощью InfraGistics WinGrid в несвязанном режиме. Таким образом, вы можете легко связать объект-агент с тегом ячейки и найти ячейку, выполнив поиск по тегам. Я бы не советовал вам использовать один элемент управления для каждого агента, поскольку у вас могут возникнуть серьезные проблемы с производительностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...