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

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

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

    screen1
    screen2
    screen3
    screen4

    Ошибка появляется при добавлении нового экземпляра запроса.
    На скринах видно, что первый запрос выполняется правильно, создает только одну группу тегов. Второй скрин уже имеет две группы тегов.
    На 3-м и 4-м скрине КП запросов переставлены местами.

    Во всех случаях должен выполняться только один запрос, то есть всегда должна быть одна группа тегов но разная. По отдельности это работает. Вместе вот такая чехарда.
    Если добавлю еще один запрос, то вообще происходит ошибка, связанная с индексацией.
    Примерно нашел где собака зарыта, но не понимаю, как необходимо объявить переменные, чтобы они работали только внутри одного запущенного экземпляра ?
    Сейчас переменные объявлены так:
    private static int[] = NAME new int[1]

    Если запросов больше 1-ого в одном запущенном экземпляре, то происходит изменение размера массива по количеству активных запросов. Но если разнести запросы по времени. То есть у одного КП поставить цикл 1 сек, у другого 30 сек и выбрать активными нужные запросы то получаем то, что на скринах.
    Первый запрос добавляет только выбранные теги, а второй запрос к тегам выбранным в первом запросе честно добавляет еще свои, третий запрос вызывает ошибку индексации, так как опять же пытается добавить еще теги к уже выбранным ранее в предыдущих запросах.

    Получается что переменные, объявляемые в драйвере живут для всех экземпляров ?????

    #9786
    manjey73
    Участник

    Как раз из этой переменной убрал static, оставив private int[]
    Теперь теги формируются правильно во всех 3-х запросах, но хромают данные…

    Есть у меня другой cs, не KpLogic, и в него необходимо передать переменную.
    Я в KpXXLogic объявлял ее как static и в другом cs просто писал KpXXLogic.переменная

    Если убрать static то ругается «Для нестатического поля, метода или свойства требуется ссылка на объект»

    Как тогда передавать переменные, еще варианты ?

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

    По разному, зависит от того, что вам нужно с ней сделать. Можно в другом классе создать метод обработки и передавать переменную в него и возвращать результат в KpLogic.
    P.S. Как задолбал этот Т9 🙂

    • Ответ изменён 8 лет, 2 месяца назад пользователем Romiros.
    #9798
    Mikhail
    Модератор

    static — глобальные для всех объектов. Без явной необходимости лучше избегать.
    Вам нужна ссылка на объект того класса, в которых надо передать переменную. Затем можно использовать свойство того класса.
    В Вашем случае массив — это объект, то есть передаётся ссылка на существующий массив, он не копируется.
    Тут зависит от того, где объект, в который надо передать, создавался.

    #9800
    manjey73
    Участник

    В DLL есть DevTemplate.cs в котором public class и в нем объявлена структура классов для сериализации, десериализации. Так понимаю это будет шаблоном.
    Как в KpXXLogic сделать копию данного класса и сериализовать/десериализовать уже копию. Потому что судя по поведению кто последний встал, того и тапки. Если правильно понял, то public делает все переменные глобальными для всех вызовов dll а не для каждого свой.
    При этом в dll есть другие куски кода в XXXX.cs, XXXX1.cs
    Нужно в KpXXLogic объявить копию глобального класса так, чтобы все остальные cs имели доступ к этим переменным только в пределах одного вызова dll и не влияли на другой, третий и так далее.

    Пока не понял как это делать без public и static.

    з.ы. а так хорошо все начиналось, думал все переменные формируются только для отдельного экземпляра вызванной dll…

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

    public — возможность использовать класс, метод или свойство из других классов и библиотек. Имеет значение экземпляр класса (ещё называется объект). Если создать 2 разных экземпляра одного класса, то каждый экземпляр будет независимым.

    public static — глобальная переменная для всех библиотек.

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

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

    Нужен
    public class A {…}
    И создание экземпляра класса A внутри Вашего КП:
    private A a = new A();

    #9805
    manjey73
    Участник

    В другом CS требует ссылку на объект для нестатического поля или метода…
    Как из другого cs библиотеки получить доступ к

    private A a = new A() ?

    Вернее если сделать private то недоступен из-за уровня защиты.
    Если сделать public то нужна ссылка, а как ее сделать помощь ничего не говорит…

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

    Если нужно использовать объекты из другого cs, то должен быть public, private позволяет только внутри самого класса.
    Создайте в другом cs public объект и вызывайте его из KpLogic.
    Бросьте код на почту, может смогу помочь

    #9810
    manjey73
    Участник

    Перенес один cs в KpXXLogic, почистил немного, переделал public на private.

    Вроде заработало как надо, но блин как тогда делить ????

    При public следующий вызов dll лезет ту да же и ломает всю структуру опроса.
    Когда устройство одно, не заметно, а два уже привет…

    з.ы. код закрытый 🙂 все таки пытаюсь сделать платный драйвер.

    #9811
    Romiros
    Участник

    Я Ваш код использовать не собираюсь, но понимаю предосторожность. Структура запроса должна формироваться в KpLogic, ну или в любом cs, но в одном. Остальным должен передаваться этот экземпляр конфига. Посмотрите как сделаны драйвера у Михаила.

    #9812
    manjey73
    Участник

    Ага, смотрю, я там не только голову, но и ноги сломаю 🙂
    Просто драйвер практически готов, за исключением настроек. Сейчас руками xml просто создаю и редактирую.

    Вот на примере DevTamplate, который делали для сериализации.
    В KpXXLogic по совету Михаила поменял вместо

    public static DevTemplate devTemlate
    на
    public DevTemplate devTemplate = new DevTemplate();

    и из другого cs не хочет получать к переменным доступ…
    Если пропишу static то ессно каждый вызов dll работает с одним блоком переменных… а надо чтобы работало каждый вызов со своим блоком данных.

    #9813
    Romiros
    Участник

    new DevTemplate() создаёт каждый раз новый экземпляр данного класса, который ничего не знает о предыдущем. Вам нужно правильно склеить два DevTemplate?

    А понял. Сделайте в KpLogic метод, который вернёт текущий DevTemplate.

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

    Если пропишу static то ессно каждый вызов dll работает с одним блоком переменных… а надо чтобы работало каждый вызов со своим блоком данных.
    Вот это мне вообще не понятно. Если каждый раз нужен новый DevTemlate в зависимости какой cs его создаёт, то создавайте их в cs и передавайте в KpLogic.

    Объясните логику на пальцах так сказать.

    #9816
    manjey73
    Участник

    В библиотеке есть несколько cs.
    Первый DevTemplate.cs в котором public class DevTamplate
    С описанием всех переменных в классах.
    Работает с сериализацией/десериализацией xml. Тут все работает….

    Другой класс собственно KpXXLogic, в котором на основе DevTemplate
    Создается свой шаблон DevTamplate devTempl = new DevTamplate();
    и так далее. Ну и есть часть других переменных промежуточных, к которым нужен доступ в других cs

    Есть другие cs, которые занимаются обработкой данных и им нужен доступ к объявленным переменным в KpXXLogic.
    Другой cs, выполняя обработку данных должен записать все значения в devTempl и другие переменные.
    Но если я их объявляю как public static, то они становятся глобальными и несколько вызовов dll пишут данные в одно место.
    Если объявляю просто как public, то они недоступны в других cs, требует ссылку на объект.
    Если как private, то их вообще не видно…
    Вот и вопрос, как передавать переменные (не только шаблон) между разными классами (cs) одной dll таким образом, чтобы следующий вызов dll создавал свой набор переменных и они были доступны между разными cs

Просмотр 15 сообщений - с 1 по 15 (из 73 всего)
  • Для ответа в этой теме необходимо авторизоваться.