![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно дождаться сбытия? [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]убери таймер вообще