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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #1110 : Ноябрь 21, 2013, 14:32 »

Не. Он не thread-safe, как и все QIODevice классы из Qt (если не ошибаюсь).

А зачем оно надо то?
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1111 : Ноябрь 21, 2013, 14:50 »

Да тут красивая плагинная архитектура у программы. Читает один плагин, пишет другой, может писать третий.
Т.е. самый простой выход - написать свой менеджер? Чтение то вынести можно, оно сигнальное, а вот писанину...

PS извиняюсь если отвлекаю.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1112 : Ноябрь 21, 2013, 15:10 »

> написать свой менеджер?

скорее всего
Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1113 : Ноябрь 24, 2013, 23:46 »

Скачал последнюю версию библиотеки, что-то не захотела собираться для qt4, пришлось немного поправить:
Код:
qserialport_unix_p.h
-#include <QtCore/qlockfile.h>
+#include "qt4support/include/QtCore/qlockfile.h"
+#ifndef QStringLiteral
+#define QStringLiteral(str) QString::fromUtf8(str)
+#endif

qserialportinfo_unix.cpp
-#include <QtCore/qlockfile.h>
+#include "qt4support/include/QtCore/qlockfile.h"

qt4support/src/qlockfile.cpp
-#include "qlockfile.h"
-#include "qlockfile_p.h"
+#include "../include/QtCore/qlockfile.h"
+#include "../include/private/qlockfile_p.h"

qt4support/include/private/qlockfile_p.h
-#include <QtCore/qlockfile.h>
+#include "../QtCore/qlockfile.h"

qt4support/src/qlockfile_unix.cpp
-#include "private/qlockfile_p.h"
+#include "../include/private/qlockfile_p.h"

qserialport_win_p.h
+#ifndef QStringLiteral
+#define QStringLiteral(str) QString::fromUtf8(str)
+#endif

qserialport_win.cpp
-#include <QtCore/qwineventnotifier.h>
+#include "qt4support/include/QtCore/qwineventnotifier.h"

Или нужно было собирать как-то по другому?
« Последнее редактирование: Ноябрь 25, 2013, 00:28 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1114 : Ноябрь 25, 2013, 14:03 »

А как собирал то? Какая ОС?
Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1115 : Ноябрь 25, 2013, 14:10 »

Собирал в Qt-creator. Linux x86-64, WindowsXP x86. После правки все собралось и работает.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1116 : Ноябрь 25, 2013, 14:14 »

Что-то не так делаешь.
Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1117 : Ноябрь 25, 2013, 14:27 »

Ага, точно. Запускал файл .pro не в корневой папке, а в src/serialport/serialport.pro Нужно было собрать только библиотеки а не весь проект. Теперь буду знать.
Записан
Bepec
Гость
« Ответ #1118 : Декабрь 07, 2013, 09:23 »

Докину мелкую проблемку.

Имеется такая прога - Virtual Null Modem (www.aggsoft....ru/virtual-null-modem.htm).
Создаёт связанные порты. Очень удобно.

Но... Библиотека не видит портов его Подмигивающий Хотя если указывать вручную, открывает и работает.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1119 : Декабрь 07, 2013, 15:18 »

Это косяк самого этого софта (ИМХО), этот баг уже есть в трекере: https://bugreports.qt-project.org/browse/QTBUG-32774

Эта софтина не устанавливает в реестре ключ типа "PortName", а имеет только ключ "PortNumber" (или как-то так), что некорректно и не соответствует рекомендациям от MS. Поэтому QSerialPortInfo игнорит это устройство, т.к. не находит его имени.

Возможно имеется и другой способ как получить имя порта для virtual-null-modem софта. Но пока я не в курсе как.. Нужно покопаться в этом.
Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1120 : Декабрь 07, 2013, 15:25 »

Просто я уже второй раз на этот "косяк" с портами попадаю. Мб стоит всё же искать в реестре ключи?

По адресу "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM" лежат все порты.

PPS а вы откуда берёте данные? (в исходниках копаться не предлагайте. Не хотите отвечать - лучше так и ответьте Улыбающийся )
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1121 : Декабрь 07, 2013, 15:42 »

> По адресу "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM" лежат все порты.

Не все.

1. Никто не мешает мне написать драйвер так, чтобы там этого не было. Но конечно, это будет изврат и так никто не делает. Улыбающийся
2. Кроме того из "DEVICEMAP\SERIALCOMM" ты можешь узнать только имя порта и больше ничего.

> PPS а вы откуда берёте данные?

В винде для получения любой инфы об устройстве принято использовать SetupClassGUID и/или DeviceInterfaceClassGuid. Т.е. каждое у-во принадлежит к какому-то предопределенному классу и можно с помощью SetupAPI проэнумеровать все доступные устройства относящиеся к определенному классу.
Для последовательных портов/модемов MS резервирует набор предопределенных классов, которые должны использовать разработчики драйверов у-в, а также дает рекомендации по содержимому веток реестра для этого:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff546990%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff546972%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff546963%28v=vs.85%29.aspx

Но если какая-то компания-разработчик драйверов кладет болт на эти рекомендации - то это их проблемы.  Улыбающийся

UPD: Ты можешь использовать свободный проект типа com0com или проприетарный от Eltima Software (неплохой софт у них) вместо проприетарного Virtual Null Modem - благо выбор огромен.
« Последнее редактирование: Декабрь 07, 2013, 15:48 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #1122 : Январь 20, 2014, 10:22 »

Опять я вылезаю из подземелья.

В очередной раз попытался собрать вашу библиотеку под VS2008/Qt 4.7.2. В коде встречаются инструкции типа find_If (насколько я понимаю это новый стандарт).

Собственно сам кусок в QSerialPortInfo_win.cpp : 210
Код:
if (std::find_if(serialPortInfoList.begin(), serialPortInfoList.end(),
 SerialPortNameEqualFunctor(s)) != serialPortInfoList.end()
){
                continue;
            }

Не могли бы вы пояснить что делает этот код ? Видимо какая то проверка, но вот на что...

PS в идеале конечно бы добавить там инструкции типа #if QT_VERSION >= 0x040100. Но это уже на ваше рассмотрение.
PPS библиотеку то собрал.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1123 : Январь 20, 2014, 10:25 »

В коде встречаются инструкции типа find_If (насколько я понимаю это новый стандарт).
Это стандартный с++ (точнее stl), довольно древний. Ни какой это не новый стандарт. Улыбающийся
http://www.cplusplus.com/reference/algorithm/find_if/
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1124 : Январь 20, 2014, 10:33 »

Код:
Видимо какая то проверка, но вот на что...

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

А в чем собственно проблема? Ошибки сборки в 2008?
« Последнее редактирование: Январь 20, 2014, 10:35 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 73 74 [75] 76 77 ... 88   Вверх
  Печать  
 
Перейти в:  


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