Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 09:53   #1
galrish
Новичок
Джуниор
 
Регистрация: 28.12.2012
Сообщений: 1
По умолчанию обработчик событий не успевает выполнится

Здравствуйте
Опишу свою проблему. Работаю с HID устройством по USB, использую библиотеку UsbLibrary, при получении данных с устройства срабатывает обработчик событий DataRecievedEventHandler(object sender, DataRecievedEventArgs args). В моем случае устройство посылает данные по 16 байт примерно 1000 раз в секунду, я их обрабатываю следующим образом

Код:
int byteSet = 0; // итоговое кол-во полученных пакетов по 16 байт

        // Обработчик событий получения данных от устройства 
        private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
        {
            int i = 1;
            while (i < 17) // первый байт всегда = 0(id пакета) я его не записываю
            {
                data.outputData.Add(args.data[i]); // добавление приходящих с устройства данных в список
                i++;
            }
            byteSet++; // считаю кол-во полученных пакетов
        }

        // Функция считывания данных с устройства
        private void readData()
        {
            int length = 0;
            outReport[1] = 0x20; // Отправляю команду на 
            sendReport();        // устройство "считать данные"
            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            timer.Start();
            while (timer.ElapsedMilliseconds < 1000)
            {
                Application.DoEvents();                 // Прослушиваю все события приложения
                if (data.outputData.Count > length)     // Проверяю приходят ли данные
                {
                    length = data.outputData.Count;     // Сбрасываю
                    timer.Reset();                      // таймер
                    timer.Start();                      // если приходят
                }
            }
        }
Проблема в том что Application.DoEvents() очень сильно загружает процессор в следствие чего я получаю данных меньше чем отправило устройство.
Есть ли какая нибудь альтернатива использованию Application.DoEvents(), т.е. прослушивать событие прихода данных с устройства не выходя из функции? Может есть какие нибудь варианты реализации с помощью BackGroundWorker?

Надеюсь не очень утомил излишней информацией и кто нибудь сможет мне помочь в данном вопросе

Последний раз редактировалось galrish; 28.12.2012 в 12:20.
galrish вне форума Ответить с цитированием
Старый 28.12.2012, 22:27   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Думаю имеет смысл сделать еще один поток, непрерывно обрабатывающий ввод. А если что-то нужно главной программе в процессе передачи, сделаете либо таймером, либо Invoke/аналоги.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик событий kostolomeo Помощь студентам 1 22.05.2012 07:49
обработчик событий IIaJIbI4 БД в Delphi 2 07.06.2011 15:09
С++ Обработчик событий hungry Общие вопросы C/C++ 11 12.05.2011 13:18
Обработчик событий в DBLookupListBox MixanMM БД в Delphi 7 29.07.2010 13:08
обработчик событий ben95 Помощь студентам 5 28.01.2008 17:46