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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #75 : Сентябрь 12, 2009, 08:14 »

Цитировать
Далее вопрос- как отключить дебаг...моя прога и так дебага выводит по 5 страниц за несколько секунд....а тут еще  библиотека спамит...
закомментировать в *.cpp файлах строчки вида:
Код:
...
#define NATIVESERIALENGINE_WIN_DEBUG
...
и пересобрать библиотеку

Цитировать
кстати таймауты это вообще нормально ?
в смысле?
Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #76 : Сентябрь 12, 2009, 10:24 »

Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning! - Эти таймауты.

Если закоментить строку #define NATIVESERIALENGINE_WIN_DEBUG
Вылазит 4 ошибки при компиляции.
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected `;' before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected `;' before '}' token
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #77 : Сентябрь 12, 2009, 15:45 »

Цитировать
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning! - Эти таймауты.
эти таймауты нужны:

1. При вызове метода waitForReadyRead(msecs) этим таймаутом будет параметр msecs, т.е. таймаут ожидания прихода данных (вообще)
2. При вызове метода read() - этим таймаутом будет величина charIntervalTimeout , т.е. таймаут ожидания прихода следующего символа

По истечении этих таймаутов будет в консоль сыпаться эти сообщения. Просто вырубить их и всё!
Значение 258 - это значение DWORD  WAIT_TIMEOUT

Цитировать
Если закоментить строку #define NATIVESERIALENGINE_WIN_DEBUG
Вылазит 4 ошибки при компиляции.
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:754: error: expected `;' before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected primary-expression before '}' token
D:/QSerialDevice_09092009_bugs_version_2300/qserialdevice/src/nativeserialengine_win.cpp:836: error: expected `;' before '}' token

Исправил + в аттач добавил последнюю "рабочую" версию.

Замечания:
1. В этой версии последний раз я тестировал ее под Windows , поэтому под *.nix могут вылезти какие нить неучтенные проблемы
2. При тестировании в виндах мне не удалось устранить баг, который заключается в том, что:
   если настроить программы reader или sreader на прием/чтение данных на дефолтных настройках размером ~ >500 байт (например 1000 байт) - и с помощью программки writer записывать в порт на 1 байт больше (т.е. например 1001) - то почему-то утилитки reader или sreader прочтут только 1000 байт, и метод waitForReadyRead (для reader) или сигнал (для sreader) не отработает!!! Такое впечатление, что винда не успевает мониторить события !

Чтобы прочитался этот оставшийся байт - нужно утилитой writer записать в порт еще несколько байт (минимум еще 1), и тогда утилиты reader или sreader прочтут все байты (т.е. в нашем случае прочтут 2 байта)

Такое поведение наблюдается при приеме сразу большого кол-ва байт (более 500) у меня по крайней мере.

Но если утилитой writer передать не на 1 , а на большее кол-во байт (например на 2) больше (т.е. 1002) - то утилиты reader или sreader прочитают сначала 1000 а потом 2 байта.. т.е. все как надо...

ЗЫ: замучался я с виндой... ужос...  был касяк с тем еще, что при получении реального кол-ва  байт в приемном буфере после отработки события, т.е. вызове ClearCommError - эта функция не обновляла в структуре COMSTAT  поле DWORD cbInQue - всегда получал я величину = 0 !! О_О ...
В общем с виндувсом одни проблемы Грустный
Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #78 : Сентябрь 12, 2009, 22:39 »

Эт не винды проблемы а qt Имхо =)
Я тут недавно на одну странность наткнулся...
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #79 : Сентябрь 13, 2009, 12:37 »

Цитировать
Эт не винды проблемы а qt Имхо =)

Qt здесь ваапче ни при чем!!!

Цитировать
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...

Надо писать на С++ классы, а не структуры! И это не относитмя к теме топика Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #80 : Сентябрь 13, 2009, 14:14 »

Итак!!!

Вышеуказанная проблема с чтением в ОС Windows вроде побеждена! Для этого пришлось делать хитрый финт (лишние телодвижения с бубном Улыбающийся )

Теперь при чтении вплоть до 4096 байт ниего не теряется! Проверено мною! Больше не проверял!

Осталось доделать и проверить еще:
1. В *.nix режимы маркер и пробел
2. Документацию до ума довести
3. Выложить на ресурс fireforge.net

Протестируйте плз! В аттач добавил!
Записан

ArchLinux x86_64 / Win10 64 bit
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #81 : Сентябрь 13, 2009, 14:55 »

3. Выложить на ресурс fireforge.net

Закинь и на http://qt-apps.org/
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #82 : Сентябрь 15, 2009, 08:40 »

Итак, добавил новую версию библиотеки
сюда: http://fireforge.net/projects/qserialdevice/
и
сюда: http://qt-apps.org/content/show.php?content=112039

Номер версии поставил v 0.1.0

Записан

ArchLinux x86_64 / Win10 64 bit
Denjs
Гость
« Ответ #83 : Сентябрь 15, 2009, 16:52 »

А почему не в разделе "Qt Components" ?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #84 : Сентябрь 15, 2009, 17:55 »

хз, не обратил внимания
Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #85 : Сентябрь 15, 2009, 21:46 »

Цитировать
Эт не винды проблемы а qt Имхо =)

Qt здесь ваапче ни при чем!!!

Цитировать
в .h файле объявляю:
struct messages {
          QString msg;
          int index;
        } message[4];
Так вот если после этого попытаться что-либо записать в message - прога тихо падает...типа сегфолта...но если в конце добавить строку объявления любой другой переменной (не структуры) то все ок-
struct messages {
          QString msg;
          int index;
        } message[4];
int sdfsdf;
Может я чего-то не понимаю.... ? Или лыжи действительно не едут...

Надо писать на С++ классы, а не структуры! И это не относитмя к теме топика Улыбающийся
Извиняюсь за повторный отход от темы, не могли бы Вы написать пример...? Как заменить структуру на класс (причем некоторые структуры используются в QList объектах).

Так же есть вопрос про структуру qt- возможно ли без создания очереди типа fifo и отдельного потока для ее обработки задерживать отправку сообщений ? Т.е. к примеру у меня есть функция которая отправляет данные \либо слот, он принимает только 1 параметр типа QString (сами данные), но в моем случае отправлять их нужно только если с момента получения последнего сообщения прошло больше 11мс...если сделать отдельную нить то это можно реализовать..но все это криво...возможно ли как то отложить выполнение сигнала ? Типа на текущем  цикле программа его пропускает по какому либо условию, на следующем проверяет условие опять и по результату пропускает\либо выполняет(сигнал т.е.). Ведь все сигналы в qt выполняются в порядке очереди...(первый вызвали первый выполнился). QTimer использовать нельзя т.к. во первых он не надежен (бывает подвисает и потом ускорено проматывает время) + не совсем понятно куда девать данные...опять же городить fifo очередь прийдется...лишние операции и процессорное время.
Записан
Denjs
Гость
« Ответ #86 : Сентябрь 16, 2009, 10:41 »

но в моем случае отправлять их нужно только если с момента получения последнего сообщения прошло больше 11мс...если сделать отдельную нить то это можно реализовать..но все это криво...возможно ли как то отложить выполнение сигнала ? Типа на текущем  цикле программа его пропускает по какому либо условию, на следующем проверяет условие опять и по результату пропускает\либо выполняет(сигнал т.е.). Ведь все сигналы в qt выполняются в порядке очереди...(первый вызвали первый выполнился).
usleep вам не поможет? и почему "отдельную нить" - это криво?
создаете отдельный класс вида "отложенная отсылка сигнала", наследуемый от QThread, в run() которого всего 2 строчки - usleep(), emit чего вам надо и deleteLater()... все.
когда надо - создаете объект этого класса и делаете ему start(). все, он сам отправит сигнал когда надо, а после сам за собой все подчистит.
Почему это не красиво? очень даже красиво...

« Последнее редактирование: Сентябрь 16, 2009, 10:43 от Denjs » Записан
yesrus
Гость
« Ответ #87 : Сентябрь 16, 2009, 10:48 »

О возможности динамического создания не подумал....спасибо! Буду пробывать.

Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
Как лучше создавать класс?
sdf rfsf();
или
sdf *tc = new sdf();
? В чем разница ?
« Последнее редактирование: Сентябрь 16, 2009, 12:02 от yesrus » Записан
Denjs
Гость
« Ответ #88 : Сентябрь 16, 2009, 12:42 »

О возможности динамического создания не подумал....спасибо! Буду пробывать.

Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
ну падать оно не должно... но не проверял...
попробуйте сигнал  QThread::finished() подключить к  самому себе к deleteLater() ?

Цитировать
Как лучше создавать класс?
... в смысле "объект"....
класс - он отдельно описывается один раз в программе. (class-name.h + class-name.cpp как правило...)
Цитировать
sdf rfsf();
или
sdf *tc = new sdf();
? В чем разница ?
в принципе - имхо без разницы.дело вкуса и локальных предпочтений.
в первом случае сам объект получаете, а во втором ссылку на него.

rfsf.start() и tc->start() - последствия для процесса одинаковые...
« Последнее редактирование: Сентябрь 16, 2009, 12:46 от Denjs » Записан
BRE
Гость
« Ответ #89 : Сентябрь 16, 2009, 12:47 »

Если ставить deletelater в конце run() то вылазит ошибка QThread: Destroyed while thread is still running и приложение полностью падает...+соответственно потом это дело болтается в памяти..так ?
Нужно не в конце run вызывать, а связать сигнал класса QThread - finised() со слотом deleteLater(). Тогда объект будет разрушать после завершения работы потока.
Записан
Страниц: 1 ... 4 5 [6] 7 8 ... 88   Вверх
  Печать  
 
Перейти в:  


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