Форум: "Начинающим";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];
ВнизКак правильно дождаться сбытия? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c