Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.31;
Скачать: CL | DM;

Вниз

Как правильно дождаться сбытия?   Найти похожие ветки 

 
Alex_C   (2008-07-24 16:35) [0]

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

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

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

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


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

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


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

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

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


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

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

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


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


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


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


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


 
clickmaker ©   (2008-07-24 16:51) [5]

> [3] Alex_C   (24.07.08 16:48)

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


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

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

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


 
Alex_C   (2008-07-24 21:24) [7]

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.08.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1216711598
OlBan
2008-07-22 11:26
2008.08.31
Отправка sms кириллица через модем


1-1197277902
chuzhakin
2007-12-10 12:11
2008.08.31
докинг панели пересоздаются


4-1194929446
balepa
2007-11-13 07:50
2008.08.31
CE_FRAME


15-1215472113
Pavia
2008-07-08 03:08
2008.08.31
WALL·E


1-1197552021
Zheksik
2007-12-13 16:20
2008.08.31
запретить вывод на консоль