Главная страница
    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.008 c
2-1216970038
Dennis I. Komarov
2008-07-25 11:13
2008.08.31
что внутри with


2-1216735433
mc2
2008-07-22 18:03
2008.08.31
TTreeView скопировать в другой


15-1215967507
No_Dead
2008-07-13 20:45
2008.08.31
Просьба не игнорировать опрос:)


15-1216030875
denic
2008-07-14 14:21
2008.08.31
В какой программе


4-1195322398
Bora_ru
2007-11-17 20:59
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский