Нужны консультации по дизайну - Статистический репортер - PullRequest
2 голосов
/ 15 марта 2010

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 15 марта 2010

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

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

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

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

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

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

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

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

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

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

1 голос
/ 15 марта 2010

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

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

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

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

0 голосов
/ 15 марта 2010

Было бы неплохо работать с фрагментом кода.

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

0 голосов
/ 15 марта 2010

Похоже, вы довольно хорошо разбираетесь в основах параллелизма.

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

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

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