2010-03-15 2 views
2

Мне нужно реализовать репортер статистики - объект, который печатает на экранную статистику. Эта информация обновляется 20 темами.Ищете совет по дизайну - Статистический репортер

Репортер должен быть самой темой, которая просыпается каждые 1 сек, читает информацию и печатает ее на экране.

Мой проект до сих пор: InfoReporterElement - один элемент информации. имеет две функции: PrintInfo и UpdateData. InfoReporterRow - один ряд на экране. Строка содержит вектор ReporterInfoElement. InfoReporterModule - модуль, состоящий из заголовка и вектора строк. InfoRporter - репортер, составленный из вектора модулей и заголовка. Репортер экспортирует функцию «PrintData», которая пересылает все модули \ rows \ basic и выводит данные на экран.

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

Основная проблема заключается в том, как обновить информацию. Должен ли я использовать один мьютекс для объекта или использовать мьютекс на базовый элемент? Кроме того, какой объект должен быть потоком - сам репортер или тот, который получил обновления от потоков?

ответ

1

Я бы сказал, что в первую очередь, должно быть нить Reporter.Для развязки базовым является выделение части чертежа из активного кода (MVC).

Сама структура здесь мало пользы. Когда вы рассуждаете в терминах Multithread, это не столько структура, сколько поток информации, который вы должны проверить.

Здесь у вас есть 20 активных темы, которые будут обновлять информацию и 1 пассивной нити, которая будет отображать его.

Проблема заключается в том, что вы столкнулись с риском внесения некоторой задержки в выполняемую работу, потому что поток active не может получить блокировку (используется для отображения). Отчетность (или ведение журнала) никогда не должна блокироваться (или как можно меньше).

Я предлагаю ввести промежуточную структуру (и поток), чтобы отделить графический интерфейс и работу: очередь очереди.

  • активные темы опубликовать событие в очередь
  • формирование очереди потоков обновления структуры выше
  • отображение нити показывает текущее состояние

Вы можете избежать некоторых проблем синхронизации, используя та же идея, что и для графики. Используйте 2 буфера: текущий (который отображается отображающим потоком) и следующий (обновляется потоком очереди). Когда поток очередей обработал пакет событий (до вас, чтобы решить, что такое пакет), он просит поменять 2 буфера, так что в следующий раз поток отображения отобразит свежую информацию.

Примечание: В более личном примечании, я не люблю вашу структуру. Рабочий поток должен точно знать, где на экране отображается элемент, который он должен обновить, это явное нарушение инкапсуляции.

Еще раз посмотрите MVC.

И так как я шея глубоко в шаблонах: смотреть Observer тоже;)

+0

Рабочая нить не должна знать ничего о точном месте, где находится элемент. 20 нитей даже не знают, что данные представлены где угодно. Объекты, которые собирают данные, «строят» структуру экранного экрана, но отныне она заботится только об InfoElements. – amitlicht

+0

ОК, я думаю, я понимаю, что вы имеете в виду. Как вы думаете, у меня должны быть объекты Builder, которые «помещают» элементы на экран? – amitlicht

+0

Вам нужно преобразовать «Событие» в представление. Если событие состоит из обновления значения, то вы, вероятно, уже имеете отображение 'value' ->' position', так как вы уже показываете его. Это действительно сродни объекту «Builder», но я не уверен, что этот термин прав ...это скорее похоже на какой-то перевод ... но давайте не будем волноваться по имени, пока работа будет завершена! –

1

Основная проблема заключается в том, чтобы обновить информацию - я должен использовать один семафор для объекта или использования мьютекса на базовый элемент?

Положить мьютекс вокруг базовой единицы действия по обновлению. Если это объект InfoReporterElement, вам нужен мьютекс на такой объект. В противном случае, если строка обновляется за раз, любой из потоков затем помещает мьютекс вокруг строки и так далее.

Кроме того, каким объектом должны быть потоки - сам репортер или тот, который получил обновления от потоков?

Вы можете поместить все их в отдельные потоки - несколько потоков писем, которые обновляют информацию и один поток читателей, который считывает значение.

0

У вас, похоже, довольно хорошее понимание основ параллелизма.

Я думал, что это будет очередь, которая имеет мьютекс, который блокирует записи и удаляет. Если у вас есть время, я бы посмотрел на свободный доступ.

Для вас вторая проблема: у меня будет только один поток читателей.

+0

У меня есть еще один вопрос - теперь я хранить значения как строки в моих объектах InfoReporterElement (порождающий). Проблема в том, что в этом случае большинство (не все) параметра являются целыми числами, и мне нужно их увеличивать. Поэтому я должен получить и установить. В этом случае у меня проблема, если мьютекс находится на уровне объекта InfoElement. Есть идеи, как с этим бороться? – amitlicht

+0

Нет, если в очереди есть мьютекс, который входящие потоки могут удержать, предотвращая доступ других потоков, вы можете обновлять столько, сколько хотите, до тех пор, пока вы не отпустите блокировку в очереди. –

0

Коду кода было бы хорошо работать.

Прикрепите мьютексы к каждому InfoReporterElement. Как вы писали в комментарии, вам нужно не только получить и установить значение элемента, но и увеличить его или, возможно, сделать еще один материал, так что я бы сделал это сделать функцию-мьютекс-член для каждой операции с блокировкой Я бы необходимость.

+0

Что вы подразумеваете под действием блокировки? – amitlicht

+0

Я имею в виду операции, которые не должны прерываться другим потоком, например. 'GetValue',' SetValue', 'Increment ',' Add' или что вам нужно. –

Смежные вопросы