![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
Есть абстракция устройства (Device). Устройство работает через COM-порт, засылая в PC некоторые измеренные значения (7 каналов измерения, на каждый по 4 байта) с частотой 50 Гц без запроса PC.
Есть абстракция файла (Storage) для хранения прочитанных данных. Storage должен поддерживать 2 ключевые операции: push_back (Element) и operator [] (int). При отображении графиков (Display) выполняется чтение из файла (Storage) необходимых данных. Потоки данных:
Очень хочется новых и интересных идей. Заранее благодарен. Это сообщение отредактировал(а) zhgutov - 15.12.2004, 01:12 --------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 4 Всего: 47 |
Ось какая?
|
|||
|
||||
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
MS Windows (на ядре NT).
--------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 4 Всего: 47 |
В двух словах
Завернуть все в треды. Приоритет на чтении из ком порта. Между Device->Storage вставить циклический буфер: Device->CyclicBuffer->Storage. Т.е. пришли на ком данные, кладешь их в циклический буфер(двигаешь Tail) и генеришь событие треду, который пишет в Storage. Он извлекает данные из буффера и пишет их в Storage. Больше этот тред нифига не делает. Его задача, ожидать событие и как только оно пришло произвести чтение буфера и записать. Циклический буфер в данном случае помогает избежать лишних объектов синхронизации. Т.е. который пишет в буфер двигает Tail, а который извлекает данные двигает Head. Что касается, чтения из ком порта, то тут не знаю, подойдут ли стандартные виндовозные средства. Я так понял есть некий протокол обмена Device <-> PC. Что касается Display, то тут вроде все просто должно быть. Просто читаешь данные из Device через определенные промежутки (допустим каждую 1 сек) и отображаешь наDisplay. |
|||
|
||||
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 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 --------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Просто делаеш два отдельных потока на чтение и запись. То что на запись открывает файл на запись с параметром SHARE_READ, тогда второй сможет обновременно читать из него. |
|||
|
||||
| zhgutov |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 14.12.2004 Репутация: 1 Всего: 2 |
А вариант с одним потоком? Это сообщение отредактировал(а) zhgutov - 16.12.2004, 14:37 --------------------
Приполз. Увидел. Укусил. |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 2 Всего: 19 |
Нормальная реализация с одним потоком работать будет хуже (замучеешся с синфронизацией). |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |