Объявление переменных в KpLogic

Стартовая страница Форумы Разработка и интеграция Объявление переменных в KpLogic

Просмотр 15 сообщений - с 46 по 60 (из 73 всего)
  • Автор
    Записи
  • #9867
    manjey73
    Участник

    Да, такой вариант работает, но лично мне очень не нравится, так как возвращаемое значение только одно. В смысле «return что-то».
    Первоначально я делал возвращение bool переменной — «выполнено/нет» и если «выполнено» знал, что в блоке данных все растасовано как надо и дальше его обрабатывал. Ну и передавал еще для обработки несколько переменных, теперь и их надо как-то передавать. Похоже тоже обернуть в класс или что-то вроде того…

    #9868
    Romiros
    Участник

    Совершенно верно. Это Ваш драйвер, ограничение ставите только Вы сами. Делайте так как удобно, в этом и прелесть объектов. Вы можете создавать классов сколько хотите.

    #9869
    manjey73
    Участник

    Ну я хочу работать с одним блоком данных, объявив его один раз. А не заниматься его копированием, передачей при каждом вызове.
    Тут ограничение скорее всего не мое, а Scada, так как KpXXLogic является подчиненным у KPLogic мне так кажется. Руки дойдут проверю на exe доступ по internal из разных cs…

    #9874
    Mikhail
    Модератор

    А не заниматься его копированием, передачей при каждом вызове.

    При передаче объекта в метод передаётся ссылка на объект, данные не копируются.

    #9875
    Mikhail
    Модератор

    Все объекты, которые Вы создадите из экземпляра KpXXLogic, будут Вам доступны именно из этого объекта КП.

    Если понадобится обмениваться данными с другими КП этого же типа (например, между КП 101 и КП 102), то для этого в драйвере предусмотрены специальные общие переменные. Ну или просто static использовать, только аккуратнее, т.к. при многопоточности могут быть чудеса.

    #9880
    manjey73
    Участник

    Да чудеса даже не при многопоточности если использовать static. Ведь если я на одну линию связи добавляю несколько КП, они ведь последовательно опрашиваются. И уже использование static влияет…

    #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 вся целиком разве не одна сборка ?

    #9882
    Romiros
    Участник

    Если предварительно не создать
    private DevTemplate _devTemplate = new DevTemplate(); и так далее то далее в коде идет ошибка «имя не существует в данном контексте»

    Ну это естественно. Прежде чем работать с объектом его нужно создать.

    • Ответ изменён 8 лет, 2 месяца назад пользователем Romiros.
    #9884
    manjey73
    Участник

    Так Михаил пишет

    При передаче объекта в метод передаётся ссылка на объект, данные не копируются.

    А приходится копировать в такие же экземпляры, чтобы с этими данными работать.

    Сейчас ни с того ни с сего прибор начинает слать больше байт чем должен, вааще в афиге….

    #9885
    Mikhail
    Модератор

    Я имел ввиду следующее:

    MyClass1 myObj1 = new MyClass1();
    MyClass2 myObj2 = new MyClass2();
    
    myObj1.ObrabotkaObjektaTipa2(myObj2);
    

    При вызове метода ObrabotkaObjektaTipa2 не происходит копирования объекта myObj2, а только передаётся ссылка на него.

    #9886
    Mikhail
    Модератор

    Сейчас ни с того ни с сего прибор начинает слать больше байт чем должен, вааще в афиге….

    Это уже сам прибор неадекватно себя ведет, вероятно?

    #9887
    Mikhail
    Модератор

    dll вся целиком разве не одна сборка ?

    Да, одна сборка. Переменная static будет общей для службы Коммуникатора.

    #9888
    Mikhail
    Модератор

    Чтобы не запутаться, можно использовать такой подход: все основные классы и объекты, кроме KpXXLogic не должны хранить в себе данные, а должны только обрабатывать данные, которые им передаются при вызове методов. Объекты, хранящие данные должны быть объявлены внутри KpXXLogic. Но при этом понадобятся отдельные объекты, которые группируют и хранят данные для передачи в методы для обработки. То есть разделить хранение данных и обработку.

    #9889
    Mikhail
    Модератор

    То есть в классах-обработчиках используются только локальные переменные в их методах и не используются поля и свойства класса.

    #9891
    manjey73
    Участник

    Чтобы обрабатывать данные, их необходимо классу предоставить.
    static это делал на ура, но почему то не на уровне вызова а вообще в целом.
    Мне кажется правильнее было бы, чтобы Коммуникатор ограничивал блоки данных каждого вызова dll, особенно учитывая, что он может вызывать библиотеки несколько раз и в несколько потоков.
    Ну да ладно, будет передавать, копировать и возвращать, раз другого пути нет…

    • Ответ изменён 8 лет, 2 месяца назад пользователем manjey73.
Просмотр 15 сообщений - с 46 по 60 (из 73 всего)
  • Для ответа в этой теме необходимо авторизоваться.