Стартовая страница › Форумы › Разработка и интеграция › Потоки(Thread) — Программы(class) — Переменные
- В этой теме 123 ответа, 4 участника, последнее обновление 2 года назад сделано
manjey73.
-
АвторЗаписи
-
23.08.2024 в 10:30 #34168
manjey73УчастникКаков механизм проверки канала и его значения из модуля ????
хотя опять же, непонятно, откуда поток берет первоначальное значение скажем 1000, если оно было изменено из WEB и должно было бы записаться и продолжать оставаться новым ?????
23.08.2024 в 10:57 #34169
manjey73УчастникУбрал SetValue по умолчанию при создании потока.
В результате вывод в канал = 0.Стоит поменять на свое и приплыли с морганием значений между по умолчанию = 0 и моим введенным.
Стоит запустить из web EN — получаем ту же картинку — моргание EN.
Что-то тут с получением данных из канала Scada то первое, то второе получаем и код это честно записывает в поток.
23.08.2024 в 11:40 #34170
JurasskParkУчастникModThread modThread = new ModThread
Никогда такого не видел.Ну в данном случае я могу только глупый совет дать.
WinForm и отлаживать запуск потоков и изменение в них переменных как в коде класса.
И если там 100 процентов всё корректно…
То значит проблема в логике инициализации модуля.Кстати, пока помню, я же не написал, почему перевод не работал в плагине. 😀
У Михайле в плагине был контрол «Представляет элемент управления, содержащий главное меню и панель инструментов. по инициализации словаря», где была инициализация словаря. Естественно, я его выкинул, т.к. в первом плагине у меня такого не было. А вот словарь я инициализировал потом, после загрузки формы.
Вот тебе и разница.
Когда в Debug версию я добавил инициализацию словаря до вызова формы, то у вас перевод загрузился.Возможно, последовательность вызова в модуле тоже влияет. Я же тоже с таким бился раньше в драйвере.
23.08.2024 в 11:45 #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; } }Всего лишь. Не знаю, все ли отсюда будет нужно в реальности. Просто позволяет тестировать в том числе.
23.08.2024 в 11:46 #34172
manjey73УчастникСкажем так, проблема начинается сразу после изменения канала в WEB.
Те каналы, которые не меняются или пока не меняются, работают без проблем.-
Ответ изменён 2 года назад пользователем
manjey73.
23.08.2024 в 12:05 #34174
JurasskParkУчастникНу так вот для изменения не из веба, сделайте консольную или WinForm версию, считывайте конфигурацию, запускайте цикл и стартуйте потоки. Потом передавайте через консоль или форму изменения и смотрите, происходит такое же или нет.
🙂
Но при запуске потока делать Guid.NewGuid я всё же советую. Очень помогает. 🙂23.08.2024 в 12:06 #34175
JurasskParkУчастникВсё. Замолкаю. Чтобы больше не злить. 🙂
23.08.2024 в 12:41 #34176
manjey73УчастникДа видимо придется делать WinForms в поисках косяка.
Не могу найти толковых примеров для случаев запуска потоков через Reflaction.
На просторах все примеры банальные типа с циклами в Console. Все это осложняет…23.08.2024 в 13:08 #34178
MikhailМодераторЧерез Reflection можно издать объект, обращаться к его свойствам и вызывать его методы. Будет ли внутри объекта поток или что-то ещё не имеет значения.
23.08.2024 в 13:12 #34179
MikhailМодераторЕсли к одной и той же переменной обращаются разные потоки, она должна быть объявлена как volatile, иначе оптимизатор может закэшировать её значение и изменение не будет «замечено» выполняющимся кодом.
23.08.2024 в 13:16 #34181
MikhailМодераторкак система взаимодействует с модулем после отправки команды?
Если модуль обрабатывает команды, то вызывается соответствующий метод модуля. Если нет, то никак.
23.08.2024 в 13:18 #34182
MikhailМодераторНа мой взгляд, подробные текстовые логи будут полезнее, чем WinForms, у которой есть ещё свои потоки обработки UI. Но тут кому как удобнее.
23.08.2024 в 13:43 #34183
manjey73УчастникВот я и пытаюсь вставлять логирование, чтобы поймать.
Сейчас добавил немножко логов и заметил, что у меня переменные из потока отображают предыдущее действие, с какого-то перепуга… Хотя опять же говорю, пока я не активировал вход или значение, никаких предыдущих значений нет.Значение в канал записывает сам модуль при старте. Планируется после перезапуска сервера сперва вычитывать файл, заносить данные в канал — это Текущее значение, которое при рестарте ПК по нулям по идее, так как текущие пишутся в tempfs и так по кругу.
Но эта бяка непонятно откуда берется?
23.08.2024 в 13:57 #34184
manjey73УчастникХотя да, если я что-то не активировал, то предыдущее = текущему или наоборот, не важно.
23.08.2024 в 14:08 #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 модуля?
Сперва принимается команда, потом ставится в очередь на отправку, а я вроде как сохраняю данные в поток и из потока. И получается что я предыдущее значение потом и отправляю. -
Ответ изменён 2 года назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.