Стартовая страница › Форумы › Разработка и интеграция › Объявление переменных в KpLogic
- В этой теме 72 ответа, 3 участника, последнее обновление 8 лет, 1 месяц назад сделано
Mikhail.
-
АвторЗаписи
-
29.06.2018 в 15:44 #9785
manjey73Участникscreen1
screen2
screen3
screen4Ошибка появляется при добавлении нового экземпляра запроса.
На скринах видно, что первый запрос выполняется правильно, создает только одну группу тегов. Второй скрин уже имеет две группы тегов.
На 3-м и 4-м скрине КП запросов переставлены местами.Во всех случаях должен выполняться только один запрос, то есть всегда должна быть одна группа тегов но разная. По отдельности это работает. Вместе вот такая чехарда.
Если добавлю еще один запрос, то вообще происходит ошибка, связанная с индексацией.
Примерно нашел где собака зарыта, но не понимаю, как необходимо объявить переменные, чтобы они работали только внутри одного запущенного экземпляра ?
Сейчас переменные объявлены так:
private static int[] = NAME new int[1]Если запросов больше 1-ого в одном запущенном экземпляре, то происходит изменение размера массива по количеству активных запросов. Но если разнести запросы по времени. То есть у одного КП поставить цикл 1 сек, у другого 30 сек и выбрать активными нужные запросы то получаем то, что на скринах.
Первый запрос добавляет только выбранные теги, а второй запрос к тегам выбранным в первом запросе честно добавляет еще свои, третий запрос вызывает ошибку индексации, так как опять же пытается добавить еще теги к уже выбранным ранее в предыдущих запросах.Получается что переменные, объявляемые в драйвере живут для всех экземпляров ?????
29.06.2018 в 16:12 #9786
manjey73УчастникКак раз из этой переменной убрал static, оставив private int[]
Теперь теги формируются правильно во всех 3-х запросах, но хромают данные…Есть у меня другой cs, не KpLogic, и в него необходимо передать переменную.
Я в KpXXLogic объявлял ее как static и в другом cs просто писал KpXXLogic.переменнаяЕсли убрать static то ругается «Для нестатического поля, метода или свойства требуется ссылка на объект»
Как тогда передавать переменные, еще варианты ?
-
Ответ изменён 8 лет, 2 месяца назад пользователем
manjey73.
29.06.2018 в 17:51 #9788Romiros
УчастникПо разному, зависит от того, что вам нужно с ней сделать. Можно в другом классе создать метод обработки и передавать переменную в него и возвращать результат в KpLogic.
P.S. Как задолбал этот Т9 🙂-
Ответ изменён 8 лет, 2 месяца назад пользователем
Romiros.
29.06.2018 в 18:24 #9798
MikhailМодераторstatic — глобальные для всех объектов. Без явной необходимости лучше избегать.
Вам нужна ссылка на объект того класса, в которых надо передать переменную. Затем можно использовать свойство того класса.
В Вашем случае массив — это объект, то есть передаётся ссылка на существующий массив, он не копируется.
Тут зависит от того, где объект, в который надо передать, создавался.29.06.2018 в 21:50 #9800
manjey73УчастникВ DLL есть DevTemplate.cs в котором public class и в нем объявлена структура классов для сериализации, десериализации. Так понимаю это будет шаблоном.
Как в KpXXLogic сделать копию данного класса и сериализовать/десериализовать уже копию. Потому что судя по поведению кто последний встал, того и тапки. Если правильно понял, то public делает все переменные глобальными для всех вызовов dll а не для каждого свой.
При этом в dll есть другие куски кода в XXXX.cs, XXXX1.cs
Нужно в KpXXLogic объявить копию глобального класса так, чтобы все остальные cs имели доступ к этим переменным только в пределах одного вызова dll и не влияли на другой, третий и так далее.Пока не понял как это делать без public и static.
з.ы. а так хорошо все начиналось, думал все переменные формируются только для отдельного экземпляра вызванной dll…
30.06.2018 в 12:53 #9802
MikhailМодераторpublic — возможность использовать класс, метод или свойство из других классов и библиотек. Имеет значение экземпляр класса (ещё называется объект). Если создать 2 разных экземпляра одного класса, то каждый экземпляр будет независимым.
public static — глобальная переменная для всех библиотек.
30.06.2018 в 12:55 #9803
MikhailМодераторНужно в KpXXLogic объявить копию глобального класса так, чтобы все остальные cs имели доступ к этим переменным только в пределах одного вызова dll и не влияли на другой, третий и так далее.
Нужен
public class A {…}
И создание экземпляра класса A внутри Вашего КП:
private A a = new A();02.07.2018 в 10:10 #9805
manjey73УчастникВ другом CS требует ссылку на объект для нестатического поля или метода…
Как из другого cs библиотеки получить доступ кprivate A a = new A() ?
Вернее если сделать private то недоступен из-за уровня защиты.
Если сделать public то нужна ссылка, а как ее сделать помощь ничего не говорит…-
Ответ изменён 8 лет, 2 месяца назад пользователем
manjey73.
02.07.2018 в 10:39 #9808Romiros
УчастникЕсли нужно использовать объекты из другого cs, то должен быть public, private позволяет только внутри самого класса.
Создайте в другом cs public объект и вызывайте его из KpLogic.
Бросьте код на почту, может смогу помочь02.07.2018 в 11:51 #9810
manjey73УчастникПеренес один cs в KpXXLogic, почистил немного, переделал public на private.
Вроде заработало как надо, но блин как тогда делить ????
При public следующий вызов dll лезет ту да же и ломает всю структуру опроса.
Когда устройство одно, не заметно, а два уже привет…з.ы. код закрытый 🙂 все таки пытаюсь сделать платный драйвер.
02.07.2018 в 13:14 #9811Romiros
УчастникЯ Ваш код использовать не собираюсь, но понимаю предосторожность. Структура запроса должна формироваться в KpLogic, ну или в любом cs, но в одном. Остальным должен передаваться этот экземпляр конфига. Посмотрите как сделаны драйвера у Михаила.
02.07.2018 в 13:29 #9812
manjey73УчастникАга, смотрю, я там не только голову, но и ноги сломаю 🙂
Просто драйвер практически готов, за исключением настроек. Сейчас руками xml просто создаю и редактирую.Вот на примере DevTamplate, который делали для сериализации.
В KpXXLogic по совету Михаила поменял вместоpublic static DevTemplate devTemlate
на
public DevTemplate devTemplate = new DevTemplate();и из другого cs не хочет получать к переменным доступ…
Если пропишу static то ессно каждый вызов dll работает с одним блоком переменных… а надо чтобы работало каждый вызов со своим блоком данных.02.07.2018 в 13:52 #9813Romiros
Участникnew DevTemplate() создаёт каждый раз новый экземпляр данного класса, который ничего не знает о предыдущем. Вам нужно правильно склеить два DevTemplate?
А понял. Сделайте в KpLogic метод, который вернёт текущий DevTemplate.
-
Ответ изменён 8 лет, 2 месяца назад пользователем
Romiros.
02.07.2018 в 14:13 #9815Romiros
УчастникЕсли пропишу static то ессно каждый вызов dll работает с одним блоком переменных… а надо чтобы работало каждый вызов со своим блоком данных.
Вот это мне вообще не понятно. Если каждый раз нужен новый DevTemlate в зависимости какой cs его создаёт, то создавайте их в cs и передавайте в KpLogic.Объясните логику на пальцах так сказать.
02.07.2018 в 14:38 #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 -
Ответ изменён 8 лет, 2 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.