Основной продукт моей компании - это большое монолитное приложение на С++, используемое для научной обработки данных и визуализации. Его кодовая база насчитывает 12 или 13 лет, и хотя мы включили в нее обновление и поддержку (использование STL и Boost - когда я присоединился к большинству контейнеров, были обычными, например, полностью обновленными до Unicode и VCL 2010 и т.д.), там одна оставшаяся, очень важная проблема: она полностью односторонняя. Учитывая, что это программа обработки и визуализации данных, это становится все более и более гандикапом.
Я - разработчик разработчиков и для следующей версии, где мы хотим решить эту проблему, и это будет трудная работа в обеих областях, Я ищу конкретный, практический и архитектурный совет о том, как решить эту проблему.
Поток данных программы может выглядеть примерно так:
- Окно должно отображать данные
- В методе paint он будет вызывать метод GetData, часто сотни раз для сотен бит данных в одной операции с краской
- Это пойдет и рассчитает или прочитает из файла или что-то еще, что требуется (часто довольно сложный поток данных), думайте об этом как данные, проходящие через сложный граф, каждый node которого выполняет операции)
Т.е. обработчик сообщения краски будет блокироваться во время обработки, а если данные еще не были рассчитаны и кэшированы, это может быть длительным. Иногда это минуты. Подобные пути встречаются и для других частей программы, которые выполняют длительные операции обработки - программа не отвечает за все время, а иногда и часы.
Я ищу совет о том, как подходить к изменению этого. Практические идеи. Возможно, такие вещи, как:
- шаблоны проектирования для асинхронного запроса данных
- хранить большие коллекции объектов, чтобы потоки могли читать и писать безопасно?
- обработка недействительности наборов данных, когда что-то пытается его прочитать?
- Существуют ли шаблоны и методы для такого рода проблем?
- что я должен спрашивать, о чем я не думал?
Я не делал многопоточного программирования с тех пор, как мои дни Uni несколько лет назад, и я думаю, что остальная часть моей команды находится в аналогичной позиции. То, что я знал, было академическим, а не практичным, и нигде не было достаточно, чтобы иметь доверие к этому.
Конечная цель - иметь полностью отзывчивую программу, где все вычисления и генерация данных выполняются в других потоках, и пользовательский интерфейс всегда реагирует. Мы не можем попасть туда за один цикл разработки:)
Изменить: Я думал, что должен добавить еще пару подробностей о приложении:
- Это 32-разрядное настольное приложение для Windows. Каждая копия лицензируется. Мы планируем сохранить его на рабочем столе, локальном приложении
- Мы используем Embarcadero (ранее Borland) С++ Builder 2010 для разработки. Это влияет на параллельные библиотеки, которые мы можем использовать, поскольку большинство из них (?) Должно быть записано только для GCC или MSVC. К счастью, они активно развивают его, и его поддержка стандартов на С++ намного лучше, чем раньше. Компилятор поддерживает эти компоненты Boost.
- Его архитектура не такая чистая, как должна быть, и компоненты часто слишком тесно связаны. Это еще одна проблема:)
Изменить # 2: Спасибо за ответы до сих пор!
- Я удивлен, что многие люди рекомендовали многопроцессорную архитектуру (это самый голосовой ответ на данный момент), а не многопоточность. У меня сложилось впечатление, что очень простая структура Unix-ish, и я ничего не знаю о ее разработке или работе. Есть ли хорошие ресурсы по этому поводу, в Windows? Это действительно так распространено в Windows?
- Что касается конкретных подходов к некоторым предложениям многопоточности, существуют ли шаблоны проектирования для асинхронного запроса и потребления данных, потоковых или асинхронных MVP-систем или разработки проектной системы или статей и книг и публикации -открытия деконструкций, иллюстрирующих вещи, которые работают, и вещи, которые не работают? Разумеется, мы можем развить всю эту архитектуру, но хорошо работать с тем, что делали раньше, и знать, какие ошибки и подводные камни следует избегать.
- Один из аспектов, который не затрагивается ни в каких ответах, - это управление этим проектом. Мое впечатление заключается в оценке того, как долго это будет продолжаться, и поддерживать хороший контроль над проектом, делая что-то неопределенным, поскольку это может быть трудно. Одна из причин, по которой я, по-видимому, после рецептов или практического кодирования, как можно больше направлять и ограничивать направление кодирования.
Я еще не ответил на этот вопрос - это не из-за качества ответов, это здорово (и спасибо), а просто потому, что из-за этого я надеюсь получить больше ответов или обсуждение. Спасибо тем, кто уже ответил!