Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно дождаться сбытия? [D7, XP]


Alex_C ©   (2008-07-24 16:35:00) 

Собственно проблема:
по таймеру, примерно раз в пол секунды происходит опрос компорта на предмет получения данных от внешнего оборудования. Происходит вызов нескольких ф-ций, запрашивающих значения разных датчиков. Как правильно сделать так, чтоб следующая ф-ция не выполнялась до тех пор, пока не будут считаны данные для предыдущей ф-ции или операция не завершится по таймауту. Для пояснения приведу код:

// Вызывается когда в порт приходят данные
procedure RxCharFromComPort;
begin
 проверяем, те ли данные пришли, и если все ок
 GoNext := true;
endd;

// Вот ф-ция таймера
procedure OnTimer(Sender: TObject);
begin
  ReadFirstData;
  while not GoNext do
     Application.ProcesMessage;
  ReadSecondData
  .... и так далее
end;

Будет ли тормазится основное приложение при такой реализации? Или есть более лучший вариант этой реализации.


Alex_C   (2008-07-24 21:24:00) [1]

Ребят, вы наверное меня не поняли. Таймер - это посылка запроса устройству, чтоб устройство в ответ послало свою телеметрию. Пример - электронный градусник, которому посылается раз в какое-то время запрос на значение температуры, а в ответ он высылает значение температуры.
Я не правильно пример привел. Он должен быть таким:

procedure OnTimer(Sender: TObject);
begin
 RequestFistData; // запрашиваем данные от уст-ва
 // теперь ждем получение данных в событии RxCharFromComPort;
 // когда данные все получены флаг GoNext выставляется в true и  идем далее
 while not GoNext do
    Application.ProcesMessage;
 RequestSecondData;
 .... и так далее
end;


Медвежонок Пятачок   (2008-07-24 16:52:00) [2]

Нет, т.к. данные приходят не одним куском, а порциями и необходимо по таймеру ждать порцию целиком (длинна известна)

И чего? Без таймера данные застрянут в порту?


clickmaker   (2008-07-24 16:51:00) [3]

> [3] Alex_C   (24.07.08 16:48)

а объект типа TEvent не подойдет?


oldman   (2008-07-24 16:49:00) [4]


> Медвежонок Пятачок ©   (24.07.08 16:37) [1]
> убери таймер вообще


Не факт...
Есть такое понятие - "флаг".
По событию флаг выставляется, а по таймеру обрабатывается.


Alex_C   (2008-07-24 16:48:00) [5]

Как это таймер убрать? А как я запрос буду посылать? Данные от оборудования приходят только после запроса.

На счет:
> Этого не достаточно?


Нет, т.к. данные приходят не одним куском, а порциями и необходимо по таймеру ждать порцию целиком (длинна известна)


Медвежонок Пятачок   (2008-07-24 16:38:00) [6]

// Вызывается когда в порт приходят данные

Этого не достаточно?


Медвежонок Пятачок   (2008-07-24 16:37:00) [7]

убери таймер вообще


Наверх

Титульная страница Поиск, карта сайта Написать письмо