Стартовая страница › Форумы › Разработка и интеграция › Потоки(Thread) — Программы(class) — Переменные
- В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано
manjey73.
-
АвторЗаписи
-
25.07.2024 в 21:04 #33604
manjey73УчастникМихаил, спасибо за подсказку, помогло, изменяя переменную останавливать цикл для остановки потока
while(!terminated)
{
код моей программы
}1 Вопрос. Количество программ мне будет известно, но мне не будет известно тип программы. Например у меня класс Programs, в котором будут собственно классы программ Program1, Program2… Programx
Допустим Program1 это Нагреватель1, Program2 это Охладитель1 ну и так далее с разными именами.
При запуске потока мне нужно создать экземпляр соответствующего названию программы класса, названия я буду получать из конфиг файла и названия возможно будут соответствовать языковым словарям.
Например я получаю из конфига строку «Нагреватель1», соответственно надо будет запустить Programs.Program1 prg = new Programs.Program1();Есть возможность в C# проделать такую процедуру, чтобы была подстановка при создании экземпляра
Programs.СЮДА_ПОДСТАВИТЬ prg = new Programs.СЮДА_ПОДСТАВИТЬ();Или в C# такие фокусы не работают и надо городить целую кучу if, else if?
2 Вопрос. Как из класса программы выше, получить весь список переменных?
Я не знаю, какая программа будет выбрана, и не везде смогу делать if, else if относительно первого случая. Надо получить полный набор переменных экземпляра класса prg, какой бы там класс не был запущен?26.07.2024 в 12:14 #33608
MikhailМодераторСлово Program понимается неоднозначно и используется в шаблоне проекта C#. Назовите лучше сценарии или что-то аналогичное, иначе путаница будет сопровождать всю разработку.
Ваша «программа» будет объектом. Вероятно, должен быть некий менеджер этих объектов в виде отдельного класса.
Можно получить описание свойств и методов любого объекта или класса, ссылка.
26.07.2024 в 12:57 #33609
manjey73УчастникНу класса Program у меня нет, это просто для понимания.
Интересный момент, пробовал добраться до типа по имени, но вот такой фокус у меня не прошел когда класс стоит за +
Scada.Server.Modules.ModХХХ.Logic.ProgramZ+Heater
Heater здесь это программа нагрева, которую и пытаюсь вытянуть по имени и получить все переменные и методы.
А вот если так, то могу создать объект и получить все переменные
Scada.Server.Modules.ModХХХ.Logic.Heaterз.ы. почему это Program так неоднозначен? у меня нормально воспринимается класс Program вложенный в класс Programs
Programs имеет список классов Program
Никаких заявлений со стороны C# что ему это не нравится нет.-
Ответ изменён 2 года, 1 месяц назад пользователем
manjey73.
26.07.2024 в 13:06 #33611
manjey73УчастникВообще цель стоит написать один кусок кода, в который будут загружаться Имена программ, вытаскиваться доступные в них переменные и методы и запускаться поток на ее выполнение.
Чтобы только в одном месте кода потом добавлять в какой-то список просто имена программ, доступных для использования.
Программы по мере обновления модуля могут добавляться, даваться им какие-то имена для выбора в интерфейсе. И чтобы не писать то там, то там добавляя новое сделать такое вот универсальное решение в каком-то одном месте.
Еще надо связывать переменные программы с каналами Scada через шаблон, что типа Вход программы, что Выход и т.д.
А как было бы замечательно к своему модулю подключить «Создать программу на FBD» вызвался бы какой-то блок расширения Сервера, там накидывалась бы программа как в ПЛК, сохранялась бы и в конфиг файл бы просто писалось имя этой программы. И уже ее вызывать на обработку со связью входов и выходов 🙂
влажные мечты 🙂
26.07.2024 в 14:47 #33612
manjey73УчастникБлин, как привести object к нужному типу, если тип узнаешь только после загрузки конфига?
Ну типа есть класс Heater, я не зная, что это Heater загружаю его в object, точнее знаю по строковой переменной «Heater» что это оно, так как я передал эту строку(получил из конфига).
var type = Assembly.GetExecutingAssembly().GetType(typelist[0].FullName); // «Scada.Server.Modules.ModХХХ.Logic.Heater»
object instance = Activator.CreateInstance(type);Теперь как мне этот объект привести к Heater ?
типа typeof(«Heater») или as «Heater» по определению работать не будут, так как я строку подсовываю.-
Ответ изменён 2 года, 1 месяц назад пользователем
manjey73.
26.07.2024 в 16:29 #33614
MikhailМодератор> Теперь как мне этот объект привести к Heater ?
Никак, потому что приведение типа делается на этапе написания кода.
Можно вызвать метод по имени, но это будет очень громоздко.
Думаю, нужно как-то обобщить разные «программы», чтобы они все наследовались об общего класса-предка, методы которого и нужно вызывать.26.07.2024 в 16:30 #33615
MikhailМодераторПосмотрите класс Calculator.
26.07.2024 в 17:02 #33616
manjey73УчастникМне непонятно, почему я могу узнать GetType() объекта, но ббббб не могу присвоить новому объекту, экземпляру этот долбаный тип.
типа var DDD = new ‘мойОбъект.GetType()’
Неужели все так сложно в датском королевстве? Какой тогда сакральный смысл о знании типа собственного же объекта?Интересно, что же я делаю, как не этап написания кода? 🙂
-
Ответ изменён 2 года, 1 месяц назад пользователем
manjey73.
26.07.2024 в 18:11 #33618Romiros
УчастникПочитайте про наследование, позднее и раннее связывание, upcast и downcast. Вам в этом направлении. Всё это уже придумано и нужно просто правильно применять.
26.07.2024 в 18:37 #33619
manjey73УчастникДа вроде пытаюсь, но постоянно предлагается работать через invoke
Мало того, мне это надо запихнуть в поток, и мало того, программа класса всегда должна работать в цикле, как выше.И когда это всегда объект это какая-то жопа ?
Вместо того, чтобы просто узнать тип и создать экземпляр скажем так узнаного типа, не прибегая к if, else и прочему.
26.07.2024 в 18:41 #33620
manjey73УчастникНу как банальный пример
var s = «привет» система понимает, что это строка
Мой же класс описан тут же в коде и имеет public доступ
var cl = new myClass(); можно
А типа
var cl1 = new xx.GetType;
нифига нельзя, хотя xx так же myClass.26.07.2024 в 18:57 #33621
manjey73УчастникЭ, ну нет у меня наследников и родителей, и не будет.
Классы програм будут совершенно разные.
С разным набором переменных, с разной логикой работы и т.д.
Общее у них только одна переменная, для выхода из цикла, чтобы завершить поток. Все. Это не принципиально.
Классы программ в процессе обновления модуля будут добавляться.
Все, что я хочу, это добавить класс с нужной логикой и в одном месте кода в список добавить имя этой программы для возможности ее добавить в интерфейсе пользователя.
А не ползать потом по коду и не добавляя if, else if , описание переменных новой программы и так далее.26.07.2024 в 19:57 #33622
manjey73УчастникВ идеале, я вообще котел бы вынести все эти классы программ в отдельную dll по типу ScadaCommFunc, чтобы можно было подключать к разным модулям. А в конфиге своего модуля просто бы держал массив имён этих программ.
Или при сборке модуля внутри держал бы изначальный список, а в конфиге дополнения, которые можно было бы использовать без пересборки модуля.27.07.2024 в 09:29 #33626
manjey73Участникчерез dynamic работает, вероятно будет работать как мне надо.
Но типа пишут будет медленно, не пробовал еще в потоки запихивать с циклическим кодом. Ну и никакой подсветки синтаксиса в VS при этом 🙁net8 на дворе, с одной стороны понятно, что все это может быть загружено из другой библиотеки, но почему не сделать элементарной проверки можешь ты создать такой объект или нет, и если можешь, то создать? не понимаю….
похоже придется делать портянку…
27.07.2024 в 09:53 #33628
manjey73УчастникНе совсем понял, чем мне поможет Calculator?
Предлагаете использовать скрипты из системы? или это был ответ на наличие FBD ?
Модуль будет коммерческим, и скажем так там не программисты будут, не знатоки scada и возможно вообще компьютеров. Все программы будут предустановлены. Добавляться если и будут, то скорее всего мной, и вот тут хотел бы сделать, чтобы добавить мог не только я, а и кто-то со стороны, при этом не трогая сам модуль. Как вариант присылают код, я его встраиваю в обновление.
-
Ответ изменён 2 года, 1 месяц назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.