Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
15-1215874647
@!!ex
2008-07-12 18:57
2008.08.31
редактирование свойств как в Object Inspector e


2-1216494439
User
2008-07-19 23:07
2008.08.31
О результате трудов - откомпилированных файлах ...


1-1197619669
Константин
2007-12-14 11:07
2008.08.31
uses необходимое


2-1216901204
webpauk
2008-07-24 16:06
2008.08.31
MdiChild


2-1216987008
Delphist
2008-07-25 15:56
2008.08.31
Генератор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский