Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
.NET 4.x

Ошибка "Невозможно вызвать Invoke или BeginInvoke." при закрытии формы

05.10.2016, 22:12. Показов 2582. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Когда закрываю приложение если строка 78 закомментирована, то в строке 80 появляется исключение "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна." Если строку 78 раскомментировать то появляется другое исключение "При вызове данного метода произошла ошибка. Поток-получатель больше не существует.".
На сколько я понял, то основная программа уже завершилась, а событие usbEventCacher почему-то работает.
1. Как мне решить данную проблему?
2. Подскажите как правильно вывести byte[] currentRecord в richTextBox_IN а то у меня выводятся не значения, а строка "System.Byte[]"?
3. И ещё есть какие-то готовые способы преобразования чисел между HEX<->DEC<->BIN для вывода в тот же richTextBox_IN?
Вообще вопросов у меня много больше))
В программировании я новичок.

Кликните здесь для просмотра всего текста
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using USBHIDDRIVER;
using USBHIDDRIVER.USB;
 
namespace WindowsFormsApplication_HID
{
    public partial class Form1 : Form
    {
        //Работа с USB HID
        USBHIDDRIVER.USBInterface usb;
        byte[] currentRecord = null;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void buttonConnect_Click(object sender, EventArgs e)
        {
            usb = new USBInterface("vid_" + textBox_VID.Text, "pid_" + textBox_PID.Text); //Ищем USB HID устройство
            Thread.Sleep(5);
 
            if (usb.Connect()) //Если подключились
            {
                usb.enableUsbBufferEvent(new System.EventHandler(usbEventCacher)); //Событие срабатывает если с устройства пришли данные
                usb.startRead(); //Запускаем чтение с устройства
                Thread.Sleep(5);
 
                labelHIDStatus.Text = "HID устройство успешно подключено";
                labelHIDStatus.ForeColor = System.Drawing.Color.Green;
            }
            else
            {
                labelHIDStatus.Text = "HID устройство не подключено к ПК";
                labelHIDStatus.ForeColor = System.Drawing.Color.Red;
            }
        }
 
        //Вывод системного времени в статус бар
        public void GetSysTime()
        {
            DateTime sysTime = DateTime.Now; //Текущее время
            while(true)
            {
                sysTime = DateTime.Now; //Получаем текущее системное время
                toolStripStatusTime.Text = sysTime.ToLongTimeString(); //Выводим в статус бар
                Thread.Sleep(1000); //Задержка 1 сек
            }
        }
 
        //Событие вызывается когда будет принят новый набор данных
        public void usbEventCacher(object sender, System.EventArgs e)
        {
            if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
            {
                //byte[] currentRecord = null;
                int counter = 0;
                while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
                {
                    //Remove this report from list
                    lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                    {
                        USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                    }
                }
                //since the remove statement at the end of the loop take the first element
                currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
                lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                {
                    USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                }
            }
 
            //Вывод получаемых данных от HID устройства в richTextBox_IN
            if (richTextBox_IN.InvokeRequired)
            {
                richTextBox_IN.Invoke((MethodInvoker)(() => richTextBox_IN.AppendText(currentRecord.ToString())));
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Thread timeThread = new Thread(new ThreadStart(GetSysTime)); //Создаём поток
            timeThread.IsBackground = true; //Работа в фоне
            timeThread.Priority = ThreadPriority.BelowNormal; //Приоритет ниже среднего
            timeThread.Start(); //Старт потока в котором получаем время
        }
 
        //Получить список всех подключенных HID устройств
        private void richTextBoxDevices_MouseClick(object sender, MouseEventArgs e)
        {
            USBHIDDRIVER.USBInterface usbI = new USBInterface("0");
            String[] list = usbI.getDeviceList();
            richTextBoxDevices.Clear();
            
            //проверка пустого list
            if (list != null)
            {
                richTextBoxDevices.Lines = list; //вывести список устройств в richTextBoxDevices
            }
            
        }
 
        //Отправка данных на HID устройство
        private void buttonSend_Click(object sender, EventArgs e)
        {
            byte[] bt = new byte[5];
            bt[0] = 0x01;
            bt[1] = 0x01;
            bt[2] = 0x01;
            bt[3] = 0x01;
            bt[4] = 0x01;
 
            usb.stopRead();
            usb.write(bt);
            usb.startRead();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.10.2016, 22:12
Ответы с готовыми решениями:

Ошибка: Невозможно вызвать Invoke или BeginInvoke
Порой мне кажется, что я слишком часто к вам обращаюсь, но прошу о помощи. Ситуация такова, существует статик класс, в котором выполняется...

Невозможно вызвать Invoke или BeginInvoke
У меня есть две формы: Form1 и Form2, в первой форме есть label1, в который я хочу из второй формы записать текст, для этого я устанавливаю...

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна
Всем привет. Написал класс для загрузки файлов, подключил его к главной форме, нажимаю загрузить, а выдает исключение &quot;Невозможно...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
06.10.2016, 00:41
Ellissar, подпишись на событие FormClosed и поставь в нем usb.stopRead();. Еще если у метода enableUsbBufferEvent есть парный disable, то вызови его. Далее при Invoke сделай так:
C#
1
2
3
4
if (IsHandleCreated && !IsDisposed)
{
    richTextBox_IN.Invoke((MethodInvoker)(() => richTextBox_IN.AppendText(currentRecord.ToString())));
}
Цитата Сообщение от Ellissar Посмотреть сообщение
2. Подскажите как правильно вывести byte[] currentRecord в richTextBox_IN а то у меня выводятся не значения, а строка "System.Byte[]"?
Это зависит от того что из себя представляют байты и как их нужно выводить. Если это просто байты, то можно преобразовать в hex или dec вид с помощью обычного цикла. Если это байты строки, то используем Encoding.GetString для соответствующей кодировки.

Цитата Сообщение от Ellissar Посмотреть сообщение
3. И ещё есть какие-то готовые способы преобразования чисел между HEX<->DEC<->BIN для вывода в тот же richTextBox_IN?
Это слишком простая и одновременно не настолько частая операция чтобы ради неё держать готовый метод. Есть только метод BitConverter.ToString(byte[]) который вернет hex-представление байтов разделенных знаком минус.

Цитата Сообщение от Ellissar Посмотреть сообщение
Вообще вопросов у меня много больше))
Жги. Не забывай только про п4.4 правил форума: На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
0
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
06.10.2016, 09:17  [ТС]
По п.1 Помогло. Приложение теперь завершается без ошибок)

п.2
Это зависит от того что из себя представляют байты и как их нужно выводить.
Это просто байты, получаемые с МК и мне их надо вывести в richTextBox_IN в одном из видов HEX, DEC, BIN (смотря что выберу в меню во время работы программы).

п.3
Это слишком простая и одновременно не настолько частая операция чтобы ради неё держать готовый метод.
Мне их в общем то только в richTextBox_IN вывести.
Получится приспособить это Encoding.GetBytes - метод (String) для моих целей?

Не забывай только про п4.4 правил форума
Понял. Это первый и последний раз))

Добавлено через 1 час 14 минут
подпишись на событие FormClosed и поставь в нем usb.stopRead();
Здесь через раз стало появляться исключение "Ссылка на объект не указывает на экземпляр объекта."
Можно как-то сделать проверку существует экземпляр объекта или нет?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,891
Записей в блоге: 1
06.10.2016, 09:23
Ellissar, метод Encoding.GetBytes() здесь не подойдет хотя бы потому что преобразует строку в масссив байтов. Тебе же нужна обратная операция. Забегая вперед - метод Encoding.GetString тебе тоже не подойдет. Используй такой метод
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
static string ArrToString(byte[] bytes, int toBase)
{
    if (bytes == null || bytes.Length == 0) return "";
 
    StringBuilder sb;
    if (toBase == 2)
    {
        sb = new StringBuilder(bytes.Length*8 + bytes.Length);
        for (int i=0; i<bytes.Length; ++i) sb.Append(Convert.ToString(bytes[i], 2).PadLeft(8, '0')).Append(' ');
    }
    else if (toBase == 10)
    {
        sb = new StringBuilder(bytes.Length*3 + bytes.Length);
        for (int i=0; i<bytes.Length; ++i) sb.Append(bytes[i].ToString()).Append(' ');
    }
    else if (toBase == 16)
    {
        sb = new StringBuilder(bytes.Length*2 + bytes.Length);
        for (int i=0; i<bytes.Length; ++i) sb.Append(bytes[i].ToString("X2")).Append(' ');
    }
    else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
 
    sb.Length--; // Убираем пробел в конце
    return sb.ToString();
}
0
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
06.10.2016, 09:50  [ТС]
Думал есть готовые методы, а вы код написали))
Всё работает как надо.
Спасибо)

Добавлено через 1 минуту
На мой вопрос по поводу
"Ссылка на объект не указывает на экземпляр объекта."
отвечу сам))
Сделал такое условие:
C#
1
2
3
4
            if(usb != null)
            {
                usb.stopRead();
            }
и ошибки не стало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2016, 09:50
Помогаю со студенческими работами здесь

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.
Помогите исправить ошибку Invoke(new MethodInvoker(InvokedConnectionStateChange)); // Ошибка: Невозможно вызвать Invoke или BeginInvoke...

При закрытии второй формы невозможно вызвать treeView1_AfterSelect из первой
Здравствуйте уважаемые форумчане! Прошу вашей помощи, возможно вопрос покажется глупым, но я хотел бы разобраться и понять в чем суть...

Невозможно вызвать Invoke или BeginInvoke
Делаю отдельный поток из Form1, в нем обращаюсь к классу Class1, из которого пытаюсь обратиться к текстбоксу Form1, вылазит ошибка...

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна
Подскажите, что делаю не так и как нужно правильно? Вот код: if (btn.InvokeRequired) { ...

Ошибка в потоке "Невозможно вызвать Invoke ."
Создал класс, который в отдельном потоке выполняет SQL запросы к базе и заполняет DataTable. Потом я решил сделать форму, которая...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru