Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Организация системы { Устройство, Файл, Дисплей }


Автор: zhgutov 15.12.2004, 00:46
Есть абстракция устройства (Device). Устройство работает через COM-порт, засылая в PC некоторые измеренные значения (7 каналов измерения, на каждый по 4 байта) с частотой 50 Гц без запроса PC.

Есть абстракция файла (Storage) для хранения прочитанных данных. Storage должен поддерживать 2 ключевые операции: push_back (Element) и operator [] (int).

При отображении графиков (Display) выполняется чтение из файла (Storage) необходимых данных.

Потоки данных:
  • Device->Storage
  • Display->Storage->Display
В программе, по меньшей мере, три потока: Device, Storage, Display. Важная цель — не пропустить данные при чтении из устройства (Device->Storage).

Очень хочется новых и интересных идей. Заранее благодарен.

Автор: bel_nikita 15.12.2004, 01:42
Ось какая?

Автор: zhgutov 15.12.2004, 01:47
MS Windows (на ядре NT).

Автор: bel_nikita 15.12.2004, 02:09
В двух словах smile Один из возможных вариантов:
Завернуть все в треды. Приоритет на чтении из ком порта.
Между Device->Storage вставить циклический буфер: Device->CyclicBuffer->Storage.
Т.е. пришли на ком данные, кладешь их в циклический буфер(двигаешь Tail) и генеришь событие треду, который пишет в Storage. Он извлекает данные из буффера и пишет их в Storage. Больше этот тред нифига не делает. Его задача, ожидать событие и как только оно пришло произвести чтение буфера и записать.
Циклический буфер в данном случае помогает избежать лишних объектов синхронизации. Т.е. который пишет в буфер двигает Tail, а который извлекает данные двигает Head.

Что касается, чтения из ком порта, то тут не знаю, подойдут ли стандартные виндовозные средства. Я так понял есть некий протокол обмена Device <-> PC.

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

Автор: zhgutov 15.12.2004, 02:30
Display читает данные из Storage, Device в данном случае только засылает данные в Storage, вплоть до получения команды остановки циклического измерения. Собственно, со скоростью обмена проблем не возникает, а если PC и сделает паузу более 20 мс, то инфа сохранится в буфере COM-порта, и поток чтения (Device) догонит устройство.

Вариант с циклическим буфером я рассматривал, используя для этого std::list <Element>. Вопрос в другом: Storage, выполняясь в отдельном потоке должен обрабатывать запросы и на чтение из файла, и на добавление. Тут есть две операции: push_back (Element) и operator [] (int). Вторая операция (Element Storage::operator [] (int) const;) должна завершаться только после извлечения значения (Element) из файла.

Поэтому интерес представляет схема работы Storage. Как организовать синхронизацию, да так, чтобы ни один поток не грузил проц впустую? Какие объекты Windows лучше использовать для синхронизации? А может у кого найдутся более конструктивные идеи по данному вопросу?

Автор: Mad 15.12.2004, 16:47
Цитата(zhgutov @ 15.12.2004, 01:30)
Вопрос в другом: Storage, выполняясь в отдельном потоке должен обрабатывать запросы и на чтение из файла

Просто делаеш два отдельных потока на чтение и запись.

То что на запись открывает файл на запись с параметром SHARE_READ, тогда второй сможет обновременно читать из него.

Автор: zhgutov 16.12.2004, 14:36
Цитата
Просто делаеш два отдельных потока на чтение и запись

А вариант с одним потоком?

Автор: Mad 16.12.2004, 14:47
Цитата(zhgutov @ 16.12.2004, 13:36)
А вариант с одним потоком?

Нормальная реализация с одним потоком работать будет хуже (замучеешся с синфронизацией).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)