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

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

  • В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано manjey73.
Просмотр 15 сообщений - с 46 по 60 (из 124 всего)
  • Автор
    Записи
  • #33689
    manjey73
    Участник

    Вам нужно решить, кто будет компилировать класс:
    1. Пользователь. И затем подкладывать dll
    2. Ваш модуль.

    в данном случае 1.

    Удобнее это делать через базовый класс или интерфейс.

    Вот как бы не выходит у меня чуда — базовый класс должен быть пустым, так как у подчиненных переменные всегда разные, кроме 2-х, это bool terminated для остановки цикла while и собственно запускаемого метода Run().
    Весь остальной набор переменных как входных так и выходных разный, не только по количеству, но и по типам переменных. Например выходная переменная Q для одного может быть bool, для другого float, для третьего int и так далее, впрочем как и входные, для одного in1 это bool, для другого это будет int и так далее.

    Что наследовать тогда?

    #33690
    manjey73
    Участник

    Собственно я уже все запустил, все работает. Разбираюсь дальше, как связывать переменные с каналами Scada и т.д.

    #33691
    JurasskPark
    Участник

    Например выходная переменная Q для одного может быть bool

    Но она может быть object 🙂

    #33692
    manjey73
    Участник

    В рамках использования Reflection они все object.
    Только вот их количество разное, у одного класса 5, у другого 20, у третьего 25.

    Какой тут нафик родитель?

    #33693
    manjey73
    Участник

    Если бы пустой родитель, каким-то образом мог взять весь список переменных наследника, который окажется при чтении, я бы мог понять. А он не может, потому что только наследник к своим переменным может взять переменные родителя.
    И тут мы вроде упираемся опять в разные классы, что C# делать не позволяет в данном случае. Или я не умею это готовить.

    #33696
    manjey73
    Участник

    (581,17): error CS0103: The name ‘Thread’ does not exist in the current context

    Упс, так понимаю System.Thread Калькулятор не поддерживает.

    Это попытка добавить public class в формулы.

    А там всего лишь Thread.Sleep(cycle);

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

    Я правильно понимаю, что добавить using System.Threads можно только в исходном коде Калькулятора ?

    • Ответ изменён 2 года, 1 месяц назад пользователем manjey73.
    #33715
    Mikhail
    Модератор

    Я правильно понимаю, что добавить using System.Threads можно только в исходном коде Калькулятора ?

    Добавить using да. Но никто не мешает написать System.Threads.MyClass

    базовый класс должен быть пустым, так как у подчиненных переменные всегда разные

    В базовом классе можно сделать метод GetVariables() и так далее. То есть обобщить использование «программы» пользователя, сделать обёртку.

    #33716
    manjey73
    Участник

    В базовом классе можно сделать метод GetVariables() и так далее. То есть обобщить использование «программы» пользователя, сделать обёртку.

    а SetVariables ?

    Обертка бы наверное подошла, но я не понимаю как ее сделать.
    И еще такой момент, так как все равно получение объекта первоначально возможна только через рефлексию, как будет реагировать VS на код
    То есть когда я делаю

    var prg = Activator.CreateInstance(type) as MyClass; например соответствующий MyClass
    То можно сразу сделать вместо var — MyClass prg

    Предположим там обертка и я увижу prg.terminated, prg.cycle которые возможны и в родительском классе.
    Как с остальными переменными? VS увидит только те, какой дочерний класс будет загружен в класс обертку?
    Собственно код потом писать все равно как при работе с объектом?

    Блин, мне бы пример правильной обертки, а то сколько не пытался, не получалось.

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

    Класс DeviceLogic является обёрткой для логики драйверов, например.
    Если созданный пользователем класс будет унаследован от базового класса, то рефлексия будет не нужно. Все действия можно будет сделать через методы базового класса. Нужно придумать этот базовый класс, чтобы им было удобно пользоваться. Исходите из того, какие действия с ним будет совершать приложение: запуск и остановка, чтение и запись переменных и т.д.

    #33732
    manjey73
    Участник

    Меня интересует где именно хранятся скомпилированные формулы ?

    Scada.Server.Engine — это где сам Calculator.

    Все формулы после компиляции где?

    Вот я взял и перенес класс в Скрипты

    public class Bla-Bla-Bla()
    {

    }
    Компиляция прошла успешно. Как мне получить данный Bla-Bla-Bla ? он где?

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

    Полученные классы хранятся в памяти приложения. Можно создать объект данного класса тоже в памяти.

    #33753
    manjey73
    Участник

    так я и спрашиваю, как его создать? нужен же какой-то «путь» ?

    Как мне в коде проверить, есть в памяти метод GetBits или класс MyClass который был скомпилирован Калькулятором?

    #33754
    JurasskPark
    Участник
                
                string className = "";
                Type type = Type.GetType(className);
    
                if (type == null)
                {
                    throw new Exception("Type not found.");
                }
                var instance = Activator.CreateInstance(type, true);
                //or
                var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance(className);
    

    className — это название класса строковое

    #33756
    manjey73
    Участник

    Название класса должно быть в виде FullName для данной функции.
    Перевожу на русский.
    Какое FullName будет для какого-то класса в памяти, скомпилированного Калькулятором?

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