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

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

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

    Каков механизм проверки канала и его значения из модуля ????

    хотя опять же, непонятно, откуда поток берет первоначальное значение скажем 1000, если оно было изменено из WEB и должно было бы записаться и продолжать оставаться новым ?????

    #34169
    manjey73
    Участник

    Убрал SetValue по умолчанию при создании потока.
    В результате вывод в канал = 0.

    Стоит поменять на свое и приплыли с морганием значений между по умолчанию = 0 и моим введенным.

    Стоит запустить из web EN — получаем ту же картинку — моргание EN.

    Что-то тут с получением данных из канала Scada то первое, то второе получаем и код это честно записывает в поток.

    #34170
    JurasskPark
    Участник

    ModThread modThread = new ModThread
    Никогда такого не видел.

    Ну в данном случае я могу только глупый совет дать.
    WinForm и отлаживать запуск потоков и изменение в них переменных как в коде класса.
    И если там 100 процентов всё корректно…
    То значит проблема в логике инициализации модуля.

    Кстати, пока помню, я же не написал, почему перевод не работал в плагине. 😀
    У Михайле в плагине был контрол «Представляет элемент управления, содержащий главное меню и панель инструментов. по инициализации словаря», где была инициализация словаря. Естественно, я его выкинул, т.к. в первом плагине у меня такого не было. А вот словарь я инициализировал потом, после загрузки формы.
    Вот тебе и разница.
    Когда в Debug версию я добавил инициализацию словаря до вызова формы, то у вас перевод загрузился.

    Возможно, последовательность вызова в модуле тоже влияет. Я же тоже с таким бился раньше в драйвере.

    #34171
    manjey73
    Участник

    ModThread modThread = new ModThread это просто мой класс, куда загружаются данные о потоке и нужная служебная инфа. Типа привязанные к потоку каналы и т.д.

            private class ModThread()
            {
                public Thread thread { get; set; }
                public FieldInfo[] fields { get; set; }
                public string nameThread { get; set; }
                public object obj { get; set; }
                public Type type { get; set; }
                public ModLogix.AllProgram allProgramm { get; set; }
                public Dictionary<string, Cnl> threadCnl { get; set; }
            }

    Всего лишь. Не знаю, все ли отсюда будет нужно в реальности. Просто позволяет тестировать в том числе.

    #34172
    manjey73
    Участник

    Скажем так, проблема начинается сразу после изменения канала в WEB.
    Те каналы, которые не меняются или пока не меняются, работают без проблем.

    • Ответ изменён 2 года назад пользователем manjey73.
    #34174
    JurasskPark
    Участник

    Ну так вот для изменения не из веба, сделайте консольную или WinForm версию, считывайте конфигурацию, запускайте цикл и стартуйте потоки. Потом передавайте через консоль или форму изменения и смотрите, происходит такое же или нет.
    🙂
    Но при запуске потока делать Guid.NewGuid я всё же советую. Очень помогает. 🙂

    #34175
    JurasskPark
    Участник

    Всё. Замолкаю. Чтобы больше не злить. 🙂

    #34176
    manjey73
    Участник

    Да видимо придется делать WinForms в поисках косяка.

    Не могу найти толковых примеров для случаев запуска потоков через Reflaction.
    На просторах все примеры банальные типа с циклами в Console. Все это осложняет…

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

    Через Reflection можно издать объект, обращаться к его свойствам и вызывать его методы. Будет ли внутри объекта поток или что-то ещё не имеет значения.

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

    Если к одной и той же переменной обращаются разные потоки, она должна быть объявлена как volatile, иначе оптимизатор может закэшировать её значение и изменение не будет «замечено» выполняющимся кодом.

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

    как система взаимодействует с модулем после отправки команды?

    Если модуль обрабатывает команды, то вызывается соответствующий метод модуля. Если нет, то никак.

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

    На мой взгляд, подробные текстовые логи будут полезнее, чем WinForms, у которой есть ещё свои потоки обработки UI. Но тут кому как удобнее.

    #34183
    manjey73
    Участник

    Вот я и пытаюсь вставлять логирование, чтобы поймать.
    Сейчас добавил немножко логов и заметил, что у меня переменные из потока отображают предыдущее действие, с какого-то перепуга… Хотя опять же говорю, пока я не активировал вход или значение, никаких предыдущих значений нет.

    Значение в канал записывает сам модуль при старте. Планируется после перезапуска сервера сперва вычитывать файл, заносить данные в канал — это Текущее значение, которое при рестарте ПК по нулям по идее, так как текущие пишутся в tempfs и так по кругу.

    Но эта бяка непонятно откуда берется?

    #34184
    manjey73
    Участник

    Хотя да, если я что-то не активировал, то предыдущее = текущему или наоборот, не важно.

    #34185
    manjey73
    Участник
    2024-08-23 14:05:12 [LAPTOP-J1GTEM7T][LAPTOP-J1GTEM7T$][ACT] Команда на канал 1001 от пользователя с ид. 11
    2024-08-23 14:05:13 [LAPTOP-J1GTEM7T][LAPTOP-J1GTEM7T$][ACT] Команда поставлена в очередь на отправку клиентам

    Убрал лишнее из лога Сервера. А не тут ли порылась собака, которая мне мешает жить в OnIteration модуля?
    Сперва принимается команда, потом ставится в очередь на отправку, а я вроде как сохраняю данные в поток и из потока. И получается что я предыдущее значение потом и отправляю.

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