Главная страница
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.012 c
15-1215605885
dms
2008-07-09 16:18
2008.08.31
Работа с LTP портом


2-1216988088
ketanov
2008-07-25 16:14
2008.08.31
WebModule


15-1215750791
shlst
2008-07-11 08:33
2008.08.31
А чего это дедушки волнуются -


3-1204373826
harisma
2008-03-01 15:17
2008.08.31
Формирование запроса с условием TOP


15-1215188901
R1ka
2008-07-04 20:28
2008.08.31
Посоветуйте, пожалуйста книгу