Стартовая страница › Форумы › Разработка и интеграция › Объявление переменных в KpLogic
- В этой теме 72 ответа, 3 участника, последнее обновление 8 лет, 1 месяц назад сделано
Mikhail.
-
АвторЗаписи
-
05.07.2018 в 09:30 #9867
manjey73УчастникДа, такой вариант работает, но лично мне очень не нравится, так как возвращаемое значение только одно. В смысле «return что-то».
Первоначально я делал возвращение bool переменной — «выполнено/нет» и если «выполнено» знал, что в блоке данных все растасовано как надо и дальше его обрабатывал. Ну и передавал еще для обработки несколько переменных, теперь и их надо как-то передавать. Похоже тоже обернуть в класс или что-то вроде того…05.07.2018 в 09:52 #9868Romiros
УчастникСовершенно верно. Это Ваш драйвер, ограничение ставите только Вы сами. Делайте так как удобно, в этом и прелесть объектов. Вы можете создавать классов сколько хотите.
05.07.2018 в 10:07 #9869
manjey73УчастникНу я хочу работать с одним блоком данных, объявив его один раз. А не заниматься его копированием, передачей при каждом вызове.
Тут ограничение скорее всего не мое, а Scada, так как KpXXLogic является подчиненным у KPLogic мне так кажется. Руки дойдут проверю на exe доступ по internal из разных cs…05.07.2018 в 19:17 #9874
MikhailМодераторА не заниматься его копированием, передачей при каждом вызове.
При передаче объекта в метод передаётся ссылка на объект, данные не копируются.
05.07.2018 в 19:21 #9875
MikhailМодераторВсе объекты, которые Вы создадите из экземпляра KpXXLogic, будут Вам доступны именно из этого объекта КП.
Если понадобится обмениваться данными с другими КП этого же типа (например, между КП 101 и КП 102), то для этого в драйвере предусмотрены специальные общие переменные. Ну или просто static использовать, только аккуратнее, т.к. при многопоточности могут быть чудеса.
06.07.2018 в 09:00 #9880
manjey73УчастникДа чудеса даже не при многопоточности если использовать static. Ведь если я на одну линию связи добавляю несколько КП, они ведь последовательно опрашиваются. И уже использование static влияет…
06.07.2018 в 10:26 #9881
manjey73УчастникЕсли не копировать данные для обработки, то ничего не передается….
в классе обработки телеграммы (CreateTelegram):public DevTemplate GetDevTemplate(DevTemplate devTemplate, byte[] subbuf_in) { _devTemplate = devTemplate; bool teleok = newTelegram(subbuf_in); if(teleok) { return _devTemplate; } else { return _devTemplate; // Если операция false возвращаем null } }Если предварительно не создать
private DevTemplate _devTemplate = new DevTemplate(); и так далее то далее в коде идет ошибка «имя не существует в данном контексте»
Так что приходится выполнять опять предварительную инициализацию и копирование полученного от другого класса шаблона в инициализированный в данном классе.
Жутко геморрно в итоге…. Так понимаю по другому никак, если избавиться от ошибок, связанных при работе в многопоточности.
з.ы. не понимаю, почему static или какой то другой вариант не может создавать доступный объект с блоком данных
1. на уровне всего приложения (вернее это работает при использовании static)
2. только на уровне dll, exe. Например 2-3 раза запускаем exe и у них у каждого свой блок данных. (вот это почему-то никак не работает, хотя вроде указано что переменная internal должна быть доступна на уровне сборки. dll вся целиком разве не одна сборка ?06.07.2018 в 13:08 #9882Romiros
УчастникЕсли предварительно не создать
private DevTemplate _devTemplate = new DevTemplate(); и так далее то далее в коде идет ошибка «имя не существует в данном контексте»
Ну это естественно. Прежде чем работать с объектом его нужно создать.-
Ответ изменён 8 лет, 2 месяца назад пользователем
Romiros.
06.07.2018 в 13:15 #9884
manjey73УчастникТак Михаил пишет
При передаче объекта в метод передаётся ссылка на объект, данные не копируются.
А приходится копировать в такие же экземпляры, чтобы с этими данными работать.
Сейчас ни с того ни с сего прибор начинает слать больше байт чем должен, вааще в афиге….
06.07.2018 в 17:57 #9885
MikhailМодераторЯ имел ввиду следующее:
MyClass1 myObj1 = new MyClass1(); MyClass2 myObj2 = new MyClass2(); myObj1.ObrabotkaObjektaTipa2(myObj2);
При вызове метода ObrabotkaObjektaTipa2 не происходит копирования объекта myObj2, а только передаётся ссылка на него.
06.07.2018 в 17:58 #9886
MikhailМодераторСейчас ни с того ни с сего прибор начинает слать больше байт чем должен, вааще в афиге….
Это уже сам прибор неадекватно себя ведет, вероятно?
06.07.2018 в 18:00 #9887
MikhailМодераторdll вся целиком разве не одна сборка ?
Да, одна сборка. Переменная static будет общей для службы Коммуникатора.
06.07.2018 в 18:03 #9888
MikhailМодераторЧтобы не запутаться, можно использовать такой подход: все основные классы и объекты, кроме KpXXLogic не должны хранить в себе данные, а должны только обрабатывать данные, которые им передаются при вызове методов. Объекты, хранящие данные должны быть объявлены внутри KpXXLogic. Но при этом понадобятся отдельные объекты, которые группируют и хранят данные для передачи в методы для обработки. То есть разделить хранение данных и обработку.
06.07.2018 в 18:04 #9889
MikhailМодераторТо есть в классах-обработчиках используются только локальные переменные в их методах и не используются поля и свойства класса.
06.07.2018 в 19:58 #9891
manjey73УчастникЧтобы обрабатывать данные, их необходимо классу предоставить.
static это делал на ура, но почему то не на уровне вызова а вообще в целом.
Мне кажется правильнее было бы, чтобы Коммуникатор ограничивал блоки данных каждого вызова dll, особенно учитывая, что он может вызывать библиотеки несколько раз и в несколько потоков.
Ну да ладно, будет передавать, копировать и возвращать, раз другого пути нет…-
Ответ изменён 8 лет, 2 месяца назад пользователем
manjey73.
-
Ответ изменён 8 лет, 2 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.