Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2021, 07:22   #1
MixanMM
Форумчанин
 
Регистрация: 09.06.2009
Сообщений: 151
По умолчанию Список событий в StringList

Добрый день, подскажите пожалуйста как реализовать добавление событий в String list или быть может, просто в таймер и вызывать их поочередно? Проблема такая - есть два датчика которые подключены к одному ком порту, если обращаться с опросом статуса к одному из них- проблем нет, а если одновременно к двум, соотвествено будет ошибка-есть идея опрашивать их текущий статус по событиям из string lista
MixanMM вне форума Ответить с цитированием
Старый 01.09.2021, 09:14   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

- а какое отношение к com-порту имеет StringList ???
- ну как же там (в StringList) накапливаются результаты опроса.
- а кто (какой код, объект) передает туда данные ?
- ...
- вот там (в том коде, объекте) и надо делать разграничение доступа к com-порту.

- но это разные объекты для каждого из портов.
- в таком случае к вашим услугам семафоры, критические секции и прочие объекты синхронизации.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.09.2021, 12:31   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
- а какое отношение к com-порту имеет StringList ???
- ну как же там (в StringList) накапливаются результаты опроса.
- а кто (какой код, объект) передает туда данные ?
- ...
- вот там (в том коде, объекте) и надо делать разграничение доступа к com-порту.

- но это разные объекты для каждого из портов.
- в таком случае к вашим услугам семафоры, критические секции и прочие объекты синхронизации.
Это излишне. В таймера вызывается функция чтения с первого датчика потом со второго. Данные заносятся в глобальный объект типо массива или записи или синглтона.
Шина общая так что опрос датчиков будет по любому последовательный. А глобальный массив будет выступать в качестве буфера или кэша. А остальные части программы уже читают из него. Это ускорит работу кода. Блокировки не нужны Интел гарантирует активность на запись DWord выполненных на границе 4. Собственно компилятор и так выравнивает данные. Единственно если датчик умный и там не просто число а некоторая структура с хронением состояние от которого зависит валидность данных то тут лучше подстраховаться и зделать мьютекс на общий глобальный объект. Или за доккументировать грязное чтение.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 01.09.2021, 13:32   #4
MixanMM
Форумчанин
 
Регистрация: 09.06.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Это излишне. В таймера вызывается функция чтения с первого датчика потом со второго. Данные заносятся в глобальный объект типо массива или записи или синглтона.
Шина общая так что опрос датчиков будет по любому последовательный. А глобальный массив будет выступать в качестве буфера или кэша. А остальные части программы уже читают из него. Это ускорит работу кода. Блокировки не нужны Интел гарантирует активность на запись DWord выполненных на границе 4. Собственно компилятор и так выравнивает данные. Единственно если датчик умный и там не просто число а некоторая структура с хронением состояние от которого зависит валидность данных то тут лучше подстраховаться и зделать мьютекс на общий глобальный объект. Или за доккументировать грязное чтение.
Весь сыр-бор из-за того что - например нажал на кнопку запуска датчика-запускается таймер с него считываются данные- отображаю показание на панели -все ок, но тут надо запустить второй датчик - и все, труба, ком порт занят первым таймером-пока он не отработает - запуск второго датчика не произойдет, поэтому и думал через некий список организовать , надеюсь понятно объяснил
MixanMM вне форума Ответить с цитированием
Старый 01.09.2021, 20:49   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Используйте функциональный тип
http://pascalabc.net/downloads/pabcn.../proctype.html
Для методов класса в конце типа добвляее of object;
Складываете свои события в массив и из него вызываете.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 02.09.2021, 02:40   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от MixanMM Посмотреть сообщение
подскажите пожалуйста как реализовать добавление событий в String list
А какие проблемы?
В моих программах работы с железяками любое действие пользователя требующее обращение к железу оформляется как некая структура/класс и заносится в список. Ранее это был TList, затем это стал TObjecList. Далее как только обработано предыдущее обращение к железякам, берется первый элемент из списка и выполняется.
northener вне форума Ответить с цитированием
Старый 02.09.2021, 10:13   #7
MixanMM
Форумчанин
 
Регистрация: 09.06.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А какие проблемы?
В моих программах работы с железяками любое действие пользователя требующее обращение к железу оформляется как некая структура/класс и заносится в список. Ранее это был TList, затем это стал TObjecList. Далее как только обработано предыдущее обращение к железякам, берется первый элемент из списка и выполняется.
Можете подсказать, может у вас уже так реализовано:
1)Нажали кнопку пуск №1
2)Идет опрос датчика №1
Приехал второй клиент
3) Нажимаем кнопку пуск №2
4) Идет опрос датчика №3
Получается что Пуск №2 произойдет только после того как окончится опрос датчика №1 и скинет статус "СТОП", но мне нужно что бы Пуск№2 сработал в не зависимотси от того идет опрос датчика №1 или нет, например если это АЗС - То в момент налива идет опрос колнки№1, и приехал второй клиент, нужно запустить вторую колонку№2 вне зависимости от того заправился на колонке №1 или не заправлился еще
MixanMM вне форума Ответить с цитированием
Старый 02.09.2021, 18:48   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от MixanMM Посмотреть сообщение
2)Идет опрос датчика №1
Объясните подробнее что вы под этим подразумеваете?
northener вне форума Ответить с цитированием
Старый 03.09.2021, 17:56   #9
MixanMM
Форумчанин
 
Регистрация: 09.06.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Объясните подробнее что вы под этим подразумеваете?
Запускается таймер 1000 :
Код:
function GetStatus(N:integer; var Status:char):boolean;
var
 Err:boolean;
begin
Buf:=#1+GetTRK_No(N)+'4'+#2+'0000000000000000'+#3; // Формирование пакета данных
CRC;                                               // Расчёт CRC
Err:=Transfer;                                     // Обмен данными с колонкой
Status:=Buf[21];                                   // Выделение статуса из пакета
Result:=Err and ((ord(Buf[20]) and $3f)=$30);      // Проверка ошибок
end;
MixanMM вне форума Ответить с цитированием
Старый 03.09.2021, 18:32   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Ну так вот. Заведите для каждой колонки флаг (переменную типа Boolean) и взводите его после запуска соответствующей колонки. А в процедуре таймера проверяйте эти флаги и посылайте по очереди команды для тех колонок, у которых этот флаг установлен. Сбрасывайте флаги по окончании залива соответствующей колонки.
Как вариант.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringList nefakt Общие вопросы Delphi 14 05.02.2014 19:55
Поиск и удаление строк в StringList из другово stringlist SmoK777 Общие вопросы Delphi 3 06.08.2012 08:21
Stringlist record222 Общие вопросы Delphi 1 26.06.2012 17:35
StringList adr Общие вопросы Delphi 0 05.11.2010 18:43
stringlist grater83 Общие вопросы Delphi 2 21.09.2009 14:26