Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация системы { Устройство, Файл, Дисплей } 
:(
    Опции темы
zhgutov
  Дата 15.12.2004, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 14.12.2004

Репутация: 1
Всего: 2



Есть абстракция устройства (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).

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

Это сообщение отредактировал(а) zhgutov - 15.12.2004, 01:12
--------------------
Приполз. Увидел. Укусил.
PM MAIL   Вверх
bel_nikita
Дата 15.12.2004, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



Ось какая?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
zhgutov
Дата 15.12.2004, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 14.12.2004

Репутация: 1
Всего: 2



MS Windows (на ядре NT).
--------------------
Приполз. Увидел. Укусил.
PM MAIL   Вверх
bel_nikita
Дата 15.12.2004, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



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

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

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


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
zhgutov
Дата 15.12.2004, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 14.12.2004

Репутация: 1
Всего: 2



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 лучше использовать для синхронизации? А может у кого найдутся более конструктивные идеи по данному вопросу?

Это сообщение отредактировал(а) zhgutov - 15.12.2004, 02:33
--------------------
Приполз. Увидел. Укусил.
PM MAIL   Вверх
Mad
Дата 15.12.2004, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 2
Всего: 19



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

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

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


--------------------
user posted image
PM MAIL   Вверх
zhgutov
Дата 16.12.2004, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 14.12.2004

Репутация: 1
Всего: 2



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

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

Это сообщение отредактировал(а) zhgutov - 16.12.2004, 14:37
--------------------
Приполз. Увидел. Укусил.
PM MAIL   Вверх
Mad
Дата 16.12.2004, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 2
Всего: 19



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

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


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.