Потоки(Thread) — Программы(class) — Переменные

Стартовая страница Форумы Разработка и интеграция Потоки(Thread) — Программы(class) — Переменные

  • В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано manjey73.
Просмотр 15 сообщений - с 1 по 15 (из 124 всего)
  • Автор
    Записи
  • #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, какой бы там класс не был запущен?

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

    Слово Program понимается неоднозначно и используется в шаблоне проекта C#. Назовите лучше сценарии или что-то аналогичное, иначе путаница будет сопровождать всю разработку.

    Ваша «программа» будет объектом. Вероятно, должен быть некий менеджер этих объектов в виде отдельного класса.

    Можно получить описание свойств и методов любого объекта или класса, ссылка.

    #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.
    #33611
    manjey73
    Участник

    Вообще цель стоит написать один кусок кода, в который будут загружаться Имена программ, вытаскиваться доступные в них переменные и методы и запускаться поток на ее выполнение.

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

    Программы по мере обновления модуля могут добавляться, даваться им какие-то имена для выбора в интерфейсе. И чтобы не писать то там, то там добавляя новое сделать такое вот универсальное решение в каком-то одном месте.

    Еще надо связывать переменные программы с каналами Scada через шаблон, что типа Вход программы, что Выход и т.д.

    А как было бы замечательно к своему модулю подключить «Создать программу на FBD» вызвался бы какой-то блок расширения Сервера, там накидывалась бы программа как в ПЛК, сохранялась бы и в конфиг файл бы просто писалось имя этой программы. И уже ее вызывать на обработку со связью входов и выходов 🙂

    влажные мечты 🙂

    #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.
    #33614
    Mikhail
    Модератор

    > Теперь как мне этот объект привести к Heater ?
    Никак, потому что приведение типа делается на этапе написания кода.
    Можно вызвать метод по имени, но это будет очень громоздко.
    Думаю, нужно как-то обобщить разные «программы», чтобы они все наследовались об общего класса-предка, методы которого и нужно вызывать.

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

    Посмотрите класс Calculator.

    #33616
    manjey73
    Участник

    Мне непонятно, почему я могу узнать GetType() объекта, но ббббб не могу присвоить новому объекту, экземпляру этот долбаный тип.

    типа var DDD = new ‘мойОбъект.GetType()’
    Неужели все так сложно в датском королевстве? Какой тогда сакральный смысл о знании типа собственного же объекта?

    Интересно, что же я делаю, как не этап написания кода? 🙂

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

    Почитайте про наследование, позднее и раннее связывание, upcast и downcast. Вам в этом направлении. Всё это уже придумано и нужно просто правильно применять.

    #33619
    manjey73
    Участник

    Да вроде пытаюсь, но постоянно предлагается работать через invoke
    Мало того, мне это надо запихнуть в поток, и мало того, программа класса всегда должна работать в цикле, как выше.

    И когда это всегда объект это какая-то жопа ?

    Вместо того, чтобы просто узнать тип и создать экземпляр скажем так узнаного типа, не прибегая к if, else и прочему.

    #33620
    manjey73
    Участник

    Ну как банальный пример
    var s = «привет» система понимает, что это строка
    Мой же класс описан тут же в коде и имеет public доступ
    var cl = new myClass(); можно
    А типа
    var cl1 = new xx.GetType;
    нифига нельзя, хотя xx так же myClass.

    #33621
    manjey73
    Участник

    Э, ну нет у меня наследников и родителей, и не будет.
    Классы програм будут совершенно разные.
    С разным набором переменных, с разной логикой работы и т.д.
    Общее у них только одна переменная, для выхода из цикла, чтобы завершить поток. Все. Это не принципиально.
    Классы программ в процессе обновления модуля будут добавляться.
    Все, что я хочу, это добавить класс с нужной логикой и в одном месте кода в список добавить имя этой программы для возможности ее добавить в интерфейсе пользователя.
    А не ползать потом по коду и не добавляя if, else if , описание переменных новой программы и так далее.

    #33622
    manjey73
    Участник

    В идеале, я вообще котел бы вынести все эти классы программ в отдельную dll по типу ScadaCommFunc, чтобы можно было подключать к разным модулям. А в конфиге своего модуля просто бы держал массив имён этих программ.
    Или при сборке модуля внутри держал бы изначальный список, а в конфиге дополнения, которые можно было бы использовать без пересборки модуля.

    #33626
    manjey73
    Участник

    через dynamic работает, вероятно будет работать как мне надо.
    Но типа пишут будет медленно, не пробовал еще в потоки запихивать с циклическим кодом. Ну и никакой подсветки синтаксиса в VS при этом 🙁

    net8 на дворе, с одной стороны понятно, что все это может быть загружено из другой библиотеки, но почему не сделать элементарной проверки можешь ты создать такой объект или нет, и если можешь, то создать? не понимаю….

    похоже придется делать портянку…

    #33628
    manjey73
    Участник

    Не совсем понял, чем мне поможет Calculator?

    Предлагаете использовать скрипты из системы? или это был ответ на наличие FBD ?

    Модуль будет коммерческим, и скажем так там не программисты будут, не знатоки scada и возможно вообще компьютеров. Все программы будут предустановлены. Добавляться если и будут, то скорее всего мной, и вот тут хотел бы сделать, чтобы добавить мог не только я, а и кто-то со стороны, при этом не трогая сам модуль. Как вариант присылают код, я его встраиваю в обновление.

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