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

Доступ к форме из потока

22.02.2020, 15:18. Показов 654. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет Всем!
Сразу скажу что программист из меня так себе Старался как мог..... (искать в интернете )

Суть во в чем.
Я сделал устройство которое подключается по ЮСБ к ПК.
С ПК программа должна отправлять данные.
Когда устройство подключено то в названии формы есть слово "Connect". Когда устройство отключаю то должно быть написано "Disconnect".

Отправка и прием данных у меня осуществляется одной функции-потоке.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
        static async void SendUSB(byte[] D)
        {
            var forma = Application.OpenForms.OfType<Form>().FirstOrDefault(f => f.Name == "Form1");
            await Task.Run(() =>
            {  
 
                //UsbDevice MyUsbDevice;
                UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x03EB, 0x20FF);
                UsbDevice MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
                ErrorCode ec = ErrorCode.None;
                try
                {
 
                    if (MyUsbDevice == null) throw new Exception();
                    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
 
                    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
                    UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep02);
 
                    int bytesWritten;
                    ec = writer.Write(D, 2000, out bytesWritten);
                    if (ec != ErrorCode.None) throw new Exception();
 
                    byte[] readBuffer = new byte[1];
                    int bytesRead = 0;
                    ec = reader.Read(readBuffer, 2000, out bytesRead);
                    ec = reader.Read(readBuffer, 2000, out bytesRead);
                    if (bytesRead == 0 || ec != ErrorCode.None) throw new Exception();
 
                    if (forma != null && forma.InvokeRequired)
                    {
                        forma.Invoke(new MethodInvoker(delegate
                        {
                            if (readBuffer[0] == 1)
                                forma.Text = "CPU_RAM loading RGB V2 - Connect";
                            if (readBuffer[0] == 2)
                                forma.Text = "CPU_RAM loading LED V2 - Connect";
                        }));
                    }
                }
                catch (Exception )
                {
                    if (forma != null && forma.InvokeRequired)
                    {
                        forma.Invoke(new MethodInvoker(delegate
                        {
                            forma.Text = "CPU_RAM loading V2 - Disconnect";
                        }));
                    }
                }
                finally
                {
                    if (MyUsbDevice != null)
                    {
                        if (MyUsbDevice.IsOpen)
                        {
                            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                            if (!ReferenceEquals(wholeUsbDevice, null))
                            {
                                wholeUsbDevice.ReleaseInterface(0);
                            }
 
                            MyUsbDevice.Close();
                        }
                        MyUsbDevice = null;
                        UsbDevice.Exit();
                    }
                }
            });
 
        }
Почему то смена названия формы отрабатывает только один раз. Дальше устройство отключай/подключай название не меняется.
В чем может быть причина?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.02.2020, 15:18
Ответы с готовыми решениями:

Доступ к контролам из потока
Пишу диспетчер задач, хочу сделать. чтобы в одной из вкладок выводилась загрузка процессора, хочу оформить это в отдельном потоке, чтобы...

Доступ к UI из другого потока
Добрый день. Никак не могу придумать, как решить мою проблему, пишу библиотеку, в которой выполняется загрузка строк, так как этот процесс...

Доступ к контролам из другого потока
Как мне получить доступ к контролам на форме из другого потока? Есть код который должен проверить checkbox свойство checked в отдельном...

4
Эксперт .NET
 Аватар для Rius
13085 / 7645 / 1670
Регистрация: 25.05.2015
Сообщений: 23,285
Записей в блоге: 14
22.02.2020, 15:48
Например, не удаётся открыть устройство. Ещё до try-catch.
Надо вам отладчиком смотреть пошагово.
0
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 39
22.02.2020, 16:04  [ТС]
Правильно ли я понимаю что когда выполняется код
C#
1
if (MyUsbDevice == null) throw new Exception();
То происходит автоматический переход в обработку исключения?

Добавлено через 9 минут
Я с трудом разобрался (если это так можно назвать) с потоками. А вот как достать данные из потока... Остается для меня загадкой.
Нашел такую статью.
Передела код.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
        public delegate void MyDelegate(int D);
 
        public void IzmeniElement(int D)
        {
            if (D == 0)
                this.Text = "CPU_RAM loading V2 - Disconnect";
            if (D == 1)
                this.Text = "CPU_RAM loading RGB V2 - Connect";
            if (D == 2)
                this.Text = "CPU_RAM loading LED V2 - Connect";
        }
 
        static async void SendUSB(byte[] D)
        {
            await Task.Run(() =>
            {  
                UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x03EB, 0x20FF);
                UsbDevice MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
                ErrorCode ec = ErrorCode.None;
                try
                {
 
                    if (MyUsbDevice == null) throw new Exception();
                    IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
 
                    UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
                    UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep02);
 
                    int bytesWritten;
                    ec = writer.Write(D, 2000, out bytesWritten);
                    if (ec != ErrorCode.None) throw new Exception();
 
                    byte[] readBuffer = new byte[1];
                    int bytesRead = 0;
                    ec = reader.Read(readBuffer, 2000, out bytesRead);
                    ec = reader.Read(readBuffer, 2000, out bytesRead);
                    if (bytesRead == 0 || ec != ErrorCode.None) throw new Exception();
 
                    BeginInvoke(new MyDelegate(IzmeniElement), readBuffer[0]);
                }
                catch (Exception )
                {
                    BeginInvoke(new MyDelegate(IzmeniElement), 0);
                }
                finally
                {
                    if (MyUsbDevice != null)
                    {
                        if (MyUsbDevice.IsOpen)
                        {
                            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
                            if (!ReferenceEquals(wholeUsbDevice, null))
                            {
                                wholeUsbDevice.ReleaseInterface(0);
                            }
 
                            MyUsbDevice.Close();
                        }
                        MyUsbDevice = null;
                        UsbDevice.Exit();
                    }
                }
            });
        }
Но компилятор выдает ошибку.
Ошибка 1 Для нестатического поля, метода или свойства "System.Windows.Forms.Control.BeginInvok e(System.Delegate, params object[])" требуется ссылка на объект
Ошибка 2 Для нестатического поля, метода или свойства "CPUv2_Soft.Form1.IzmeniElement(int) " требуется ссылка на объект
0
Эксперт .NET
 Аватар для Rius
13085 / 7645 / 1670
Регистрация: 25.05.2015
Сообщений: 23,285
Записей в блоге: 14
22.02.2020, 16:32
Invoke и BeginInvoke это методы класса Control и вызывать их можно только с указанием - к кому они относятся.

Добавлено через 3 минуты
Цитата Сообщение от LEVVARRR Посмотреть сообщение
Я с трудом разобрался (если это так можно назвать) с потоками.
Довольно подробно и понятно про обращение с потоками написано в первой книге Литература по C# для начинающих и не только , главы 23-24.

Добавлено через 10 минут
Цитата Сообщение от LEVVARRR Посмотреть сообщение
То происходит автоматический переход в обработку исключения?
До ближайшего catch, который такое исключение отловит. Если никто не удосужится его поймать, приложение либо поток падает.
1
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 39
22.02.2020, 17:29  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Довольно подробно и понятно про обращение с потоками написано в первой книге Литература по C# для начинающих и не только , главы 23-24.
Да...... Читать там уйма...... Аж грустно стало..... Хотя раньше у меня как то менялся "Connect" / "Disconnect".

Добавлено через 15 минут
А вот и прикол!
При загрузке формы она у меня автоматически скрывается
C#
1
2
3
4
5
        
private void Form1_Shown(object sender, EventArgs e)
        {
            this.Hide();
        }
Но при отладке это не удобно так что я задокументирован строку. И о ЧУДО! Надпись стало отображаться коректно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.02.2020, 17:29
Помогаю со студенческими работами здесь

Доступ к контроллам из другого потока
private void changeInfo(MyEventArgs mea) { if (InvokeRequired) { Invoke(new...

Доступ к Control из другого потока
Пример из книги: Эндрю Троелсен &quot;Язык программирования C# 5.0 и платформа .NET 4.5&quot; (6-е издание) Программа зависает при вызове...

Доступ к TextBox из другого потока
Здравствуйте. У меня есть TextBox, в который я пишу все логи, но когда я пытаюсь сделать это из другого потока, у меня вылазит ошибка. Саму...

Доступ к компонентам формы из потока
имеется условно: private void button1_Click(object sender, EventArgs e) { Thread FirstThread = new Thread(FirstProc); ...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru