Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 83

Передаю данные в интерфейс через делегат

28.08.2021, 13:34. Показов 971. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Пишу программ для опроса модбас регистров. Опрашиваю по таймеру
C#
1
2
3
4
5
 
            timer1 = new System.Timers.Timer();
            timer1.Interval = 1000;
            timer1.Elapsed += Count;
            timer1.Start();
и вызывают функцию :

C#
1
2
3
4
5
6
7
8
9
10
void Count(object sender = null, System.Timers.ElapsedEventArgs e = null)
        {
            timer1.Stop();
            GetUrms();
            GetPhaseAngle();
            GetP();
            GetI();
            timer1.Start();
}
;
и в этих функция уже опрашиваю нужные регистры, значение через делегат передаю в интерфейс.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        public void GetP()
        {
            //s32
            /*массив сделал глобальный для смены канала
             UInt16[] p_ch = { 4866, 4868, 4870 };
             UInt16[] p_ch2 = { 8962, 8964, 8966 };
             UInt16[] p_ch3 = { 13058, 13060, 13062 };
             UInt16[] p_ch4 = { 17154, 17156, 17158 };
             */
            double result = 0;
            Label[] label = { ch_p_L1, ch_p_L2, ch_p_L3 };
 
 
            for (int i = 0; i <= 2; i++)
            {
                byte[] bytes = send_get_frames(slaveaddress, 4, p_ch[i], 2);
                if (bytes.Length >= 2)
                {
                    result = ((Int32)(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3])) * 0.00512;
                    Dispatcher.Invoke(() =>
                    {
                        label[i].Content = result.ToString("0.00");
                    });
                }
            }
        }
И как мне требуется записать значение в регистры я останавливаю таймер, а потоки которое порождаются через делегат, потом завершаются и после того как я записал я заново запускаю таймер, и периодически получаются наложения и вылетаю по исключениям, бывает что при нажатие на кнопку таймер не останавливается.
Подскажите как сделать примерно тоже самое но без таймера или с таймером но что бы он запускался только после тогда как выполнил функцию. Я сделал вначале stop а в конце старт. Но когда останавливаю его из другого места он снова запускаться.

Извините если получилось сумбурно, зашел в тупик просто.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.08.2021, 13:34
Ответы с готовыми решениями:

Описать класс с функцией. Объявить делегат. Произвести вызов функции через делегат
Описать функцию Exchange(X, Y), меняющую значения переменных X и Y.

Как в методе получить значения атрибутов класса, если я передаю на вход этого метода интерфейс, а не класс?
Вот такая задача : &quot;Создайте класс JsonCollector, с методом void getInfo(JSONImportable ji), который принимает на вход объекты и записывает...

Требуется класс, делегат, перечисление, интерфейс или структура
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace...

6
 Аватар для kernel_mode
70 / 47 / 16
Регистрация: 21.07.2021
Сообщений: 187
28.08.2021, 13:42
Куда лучше использовать потоки на мой взгляд.
Создать вечный цикл чтения шины и проверку на ожидания ввода из вне, не забыть синхронизировать потоки при помощи Monitor, либо же конструкцией Lock (что в принципе одно и то же).
В случае, если запрос на ввод поступил - не запускать чтение в текущей итерации цикла.

С делегатом все верно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.08.2021, 14:21
Цитата Сообщение от sbalymov Посмотреть сообщение
Подскажите как сделать примерно тоже самое
Один из вариантов: инкапсуляция таймера с локировкой доступа к нему.

Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Timers;
 
namespace Febr20y
{
    public static class MyTimer
    {
        private static readonly System.Timers.Timer timer = new System.Timers.Timer();
        static MyTimer()
        {
            timer.Interval = 1000;
            timer.Elapsed += Count;
            timer.Start();
        }
 
        private static void Count(object sender, ElapsedEventArgs e)
        {
            lock (timer)
            {
                timer.Stop();
                Tick?.Invoke();
                timer.Start();
            }
        }
 
        public static event Action Tick;
 
        public static void Start()
        {
            lock (timer)
            {
                timer.Start();
            }
        }
 
        public static void Stop()
        {
            lock (timer)
            {
                timer.Stop();
            }
        }
    }
}
Добавлено через 3 минуты
В в синхронных обработчиках Tick недолжно быть вызовов MyTimer.Start() и MyTimer.Stop() - иначе возможно ситуация взаимоблокировки.

Добавлено через 6 минут
Цитата Сообщение от sbalymov Посмотреть сообщение
Dispatcher.Invoke(() =>
Это ж...!
Очень плохой код - прямо нарываетесь на неприятности: баги, ошибки, самоблокировки и т.п.
Создайте Контекст Данных (ViewModel).
В XAML задайте привязки к его свойства.
И значения свойств Контекста Данных сможете менять в любом потоке.
Привязки сами безопасно маршрутизируют их изменение в UI поток.
0
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 83
28.08.2021, 15:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В в синхронных обработчиках Tick недолжно быть вызовов MyTimer.Start() и MyTimer.Stop() - иначе возможно ситуация взаимоблокировки.
Я убирал, но стало вываливать исключение, пришлось увеличить время иначе было исключение.

Спасибо, сейчас буду разбираться с ViewModel.
Миниатюры
Передаю данные в интерфейс через делегат  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
28.08.2021, 15:35
Цитата Сообщение от sbalymov Посмотреть сообщение
Я убирал, но стало вываливать исключение, пришлось увеличить время иначе было исключение.
Покажите полностью код.
Возможно "кочки" совсем не там где вы их ищите.

Добавлено через 50 секунд
"полностью код" - это полностью всё содержимое файла!
0
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 83
28.08.2021, 15:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"полностью код" - это полностью всё содержимое файла!
За ранее извиняюсь за испытанную боль, когда вы увидите что я там понаписал
Вложения
Тип файла: rar wb-map.rar (6.48 Мб, 0 просмотров)
0
0 / 0 / 0
Регистрация: 08.01.2020
Сообщений: 83
28.08.2021, 16:19  [ТС]
Поставил таймер 3с. Стало все ок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2021, 16:19
Помогаю со студенческими работами здесь

Требуется класс, делегат, перечисление, интерфейс или структура
помогите понять в чем тут всё таки ошибка, все попытки исправить самостоятельно были безрезультатны... using System; using...

Пишет требуется класс, делегат, перечисление, интерфейс или структура
private void button1_Click(object sender, EventArgs e) { if (textBox1.Text==&quot;4&quot;) { label2.Text=&quot;Правильно&quot;; b = b + 1; } else...

Php+ajax передаю данные формы в базу mysql
От сюда $(function() { $('#chat_submit').click(function(e) { e.preventDefault(); var chat_name =...

Я передаю дату через DatePicker xaml для БД
я передаю дату через DatePicker xaml, но при добавлении в БД MySqlCommand cmd = new MySqlCommand(query, Connection); ...

передаю массив произвольных байт через блютуз-модуль с STM32
хочу в смартфоне сохранить файл. Байты всякие, могут символы, могут нет. Терминал в смартфоне под Андроидом сами байты видит, в окошке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru