Russian Qt Forum
Май 04, 2024, 22:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 69 70 [71] 72 73 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 752995 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1050 : Декабрь 25, 2012, 11:21 »

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

Цитировать
вызывается CommOverlappedEventNotifier::processCompletionRoutine с флагом EV_ERR, что и приводит к загрузке одного ядра процессора.

Драйвер порта корректно отрабатывает ошибочную ситуацию.

Кстати, а какое ghb 'njv значение ошибки error d bool SerialPortPrivate::processIoErrors()?

UPD:
Догадываюсь, что это будет CE_BREAK. Т.е. твой девайс при отключении/включении сажает Rx линию на ноль.
Если так - то меняй прошивку девайса.
« Последнее редактирование: Декабрь 25, 2012, 11:27 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1051 : Декабрь 25, 2012, 11:49 »

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

Цитировать
вызывается CommOverlappedEventNotifier::processCompletionRoutine с флагом EV_ERR, что и приводит к загрузке одного ядра процессора.

Драйвер порта корректно отрабатывает ошибочную ситуацию.

Кстати, а какое ghb 'njv значение ошибки error d bool SerialPortPrivate::processIoErrors()?

UPD:
Догадываюсь, что это будет CE_BREAK. Т.е. твой девайс при отключении/включении сажает Rx линию на ноль.
Если так - то меняй прошивку девайса.
Правильно догадываешься. Но проблема в том, что он один раз выдает этот код ошибки, а потом в бесконечный вызов этой процедуры (bool SerialPortPrivate::processIoErrors()) входит, не заходя в if (ret && error), т.е. clearCommError(...) возвращает false. Не должна же одна ошибка полностью твою библиотеку весить.
« Последнее редактирование: Декабрь 25, 2012, 11:53 от Kurles » Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1052 : Декабрь 25, 2012, 12:04 »

Тогда попробуй в CommOverlappedEventNotifier::processCompletionRoutine() добавить вызов GetOverlappedResult(), т.е.
должно быть как-то так:

Код
C++ (Qt)
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0; // это добавь
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE); // и это
       bool ret = false;
       if (EV_ERR & triggeredEventMask)
           ret = dptr->processIoErrors();
       if (EV_RXCHAR & triggeredEventMask)
           ret = dptr->startAsyncRead();
       return ret;
   }
 

Возможно, все-таки мой касяк Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1053 : Декабрь 25, 2012, 12:18 »

Тогда попробуй в CommOverlappedEventNotifier::processCompletionRoutine() добавить вызов GetOverlappedResult(), т.е.

Возможно, все-таки мой касяк Улыбающийся
К сожалению поведение не изменилось Грустный
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1054 : Декабрь 25, 2012, 12:38 »

Ок, тогда добавь еще это:
Код
C++ (Qt)
   CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent)
       : AbstractOverlappedEventNotifier(d, CommEvent, false /*Тут false вместо true поставь*/, parent)
 

UPD:
Цитировать
К сожалению поведение не изменилось
А оно по идее и не должно измениться, пока Rx замкнут на землю.
« Последнее редактирование: Декабрь 25, 2012, 12:41 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1055 : Декабрь 25, 2012, 13:03 »

Ок, тогда добавь еще это:
Код
C++ (Qt)
   CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent)
       : AbstractOverlappedEventNotifier(d, CommEvent, false /*Тут false вместо true поставь*/, parent)
 

UPD:
Цитировать
К сожалению поведение не изменилось
А оно по идее и не должно измениться, пока Rx замкнут на землю.
Он же потом сразу размыкается. Добавил, зацикливание на processIoErrors() пропало, проц не грузится, но какие-либо данные после CE_BREAK не поступают.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1056 : Декабрь 25, 2012, 13:35 »

Цитировать
Добавил, зацикливание на processIoErrors() пропало
Но а вообще, processIoErrors() вызывается при замкнутых ногах?
Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1057 : Декабрь 25, 2012, 13:45 »

Цитировать
Добавил, зацикливание на processIoErrors() пропало
Но а вообще, processIoErrors() вызывается при замкнутых ногах?
Один раз вызывается - и всё, больше ни на что не реагирует. Но зацикливания нет. Второй раз processIoErrors() не вызывается.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1058 : Декабрь 25, 2012, 14:32 »

Ок, тогда все что было внесено ранее (с добавлением false) - оставь, а измени теперь только CommOverlappedEventNotifier::processCompletionRoutine() на:

Код
C++ (Qt)
 
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0;
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE);
       if (EV_ERR & triggeredEventMask)
           dptr->processIoErrors();
       dptr->startAsyncRead();
       return true;
   }
 

« Последнее редактирование: Декабрь 25, 2012, 14:38 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1059 : Декабрь 25, 2012, 14:40 »

Ок, тогда все что было внесено ранее (с добавлением false) - оставь, а измени теперь только CommOverlappedEventNotifier::processCompletionRoutine() на:

Код
C++ (Qt)
 
   virtual bool processCompletionRoutine() {
       DWORD numberOfBytesTransferred = 0;
       ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE);
       if (EV_ERR & triggeredEventMask)
           dptr->processIoErrors();
       dptr->startAsyncRead();
       return true;
   }
 
Работает!!! Спасибо Улыбающийся
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1060 : Декабрь 25, 2012, 14:42 »

Тогда этот фикс пойдет в патч. Но ты все-равно проверь загрузку CPU. Она должна быть около нуля.
Записан

ArchLinux x86_64 / Win10 64 bit
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #1061 : Декабрь 25, 2012, 14:51 »

Тогда этот фикс пойдет в патч. Но ты все-равно проверь загрузку CPU. Она должна быть около нуля.
Так и есть. Если что - отпишусь. Еще раз спасибо. Уже второй раз оперативно помогаешь Улыбающийся
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
b-s-a
Гость
« Ответ #1062 : Декабрь 27, 2012, 13:38 »

kuzulis, когда фиксишь баг, найденный другим пользователем проси, чтобы он зарегистрировался на qt-project и поддерживал твой патч. А то ты меня просишь поддержать, а я не всегда в курсе (форум не каждый день читаю).
Записан
qt_beginner
Гость
« Ответ #1063 : Февраль 07, 2013, 14:14 »

Почему нет возможности работать с устройствами /dev/pts/ ?
Раньше такая возможность была, а теперь с ними нельзя работать - скорость обмена не выставляется
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1064 : Февраль 07, 2013, 18:25 »

Не может быть.
Приведи здесь шаги как воспроизвести проблему от начала и до конца.
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 69 70 [71] 72 73 ... 88   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.208 секунд. Запросов: 23.