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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #450 : Июнь 17, 2011, 07:50 »

lit-uriy ,
полностью тебя поддерживаю! Имхо, нужно реализовать (просто переписать) так, как уже реализовано в текущее время.

b-s-a ,
твоя хотелка (а точнее конторская) - это частный узкоспециализированный случай, ИМХО, не стоит включать это в библиотеку.
Ты можешь сделать для этого отдельную ветку для себя.  Подмигивающий
Тем более, не нужно использовать какие-то таймеры и т.п. которые будут неподецки грузить процессор.

Предлагаю оставить всё как есть, т.е использовать QSocketNotifier + QWinEventNotifier (т.к. всё-равно надеемся на интеграцию библиотеки в Qt, то можно использовать и приватные классы).
Иные варианты (потоки, таймеры, контроль вплоть до милисекунд) , ИМХО, тут неуместны, т.к. это всё "костыли".
Тем более, последовательный интерфейс UART RS232С/485 и т.п. по своей сути является асинхронным,
поэтому не может быть речи ни о каких жестких таймаутах и т.п.

Тут меня вполне устраивает реализация аналогичная QAbstractSocket, естественно, её нужно немножко подрихтовать, а также убрать промежуточный класс
*engine*.
И всё будет замечательно, быстро, и нажёжно!

Могу одно сказать:
я бился над "лучшим" вариантом и скурпулезно тестировал и проверял разные варианты целых 1,5 года, но в итоге пришел к тому что есть, ИМХО.

Цитата: b-s-a
kuzulis, добавь меня коммитером, сделаю тебе чистую ветку.
ОК.
1. Как это сделать (добавить коммитером)?
2. Кто еще изъявляет желание быть коммитером? Улыбающийся

Цитата: b-s-a
Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии (а то вдруг опять кто-то кого-то не понял, или подзабыл).

Вот:

SerialPort
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QtCore/QIODevice>
 
class SerialPortPrivate;
 
class QSERIALDEVICE_EXPORT SerialPort : public QIODevice
{
   Q_OBJECT
 
   Q_PROPERTY(Rate rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
 
   Q_ENUMS( Directions Rate DataBits Parity StopBits FlowControl Lines DataErrorPolicy SerialError )
 
public:
 
   enum Direction  {
       Input = 1,
       Output = 2
   };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   enum Rate {
       Rate1200 = 1200,
       Rate2400 = 2400,
       Rate4800 = 4800,  
       Rate9600 = 9600,
       Rate19200 = 19200,
       Rate38400 = 38400,  
       Rate57600 = 57600,
       Rate115200 = 115200,
       UnknownRate = -1
   };
 
   enum DataBits {
       Data5 = 5,
       Data6 = 6,
       Data7 = 7,
       Data8 = 8,
       UnknownDataBits = -1
   };
 
   enum Parity {
       NoParity = 0,
       EvenParity = 2,
       OddParity = 3,        
       SpaceParity = 4,
       MarkParity = 5,        
       UnknownParity = -1
   };
 
   enum StopBits {
       OneStop = 1,
       OneAndHalfStop = 3,
       TwoStop = 2,
       UnknownStopBits = -1
   };
 
   enum FlowControl {
       NoFlowControl,      
       HardwareControl,
       SoftwareControl,
       UnknownFlowControl = -1
   };
 
   enum Line {
       Le = 0x01,
       Dtr = 0x02,
       Rts = 0x04,
       St = 0x08,
       Sr = 0x10,
       Cts = 0x20,
       Dcd = 0x40,
       Ri = 0x80,
       Dsr = Le    
   };
   Q_DECLARE_FLAGS(Lines, Line)
 
   enum DataErrorPolicy {
       SkipPolicy,
       PassZeroPolicy,
       IgnorePolicy,
       StopReceivingPolicy
   };
 
   enum SerialError {
       NoError,                
       NoSuchDeviceError,          
       PermissionDeniedError,      
       DeviceAlreadyOpenedError,    
       DeviceIsNotOpenedError,      
       ParityError,
       IoError
   };
 
   explicit SerialPort(QObject *parent = 0);
   explicit SerialPort(const QString &name, QObject *parent = 0);
   explicit SerialPort(const SerialPortInfo &info, QObject *parent = 0);
   virtual ~SerialPort();
 
   void setName(const QString &name); // << Имена только: "COM1", "ttyS0" !!!
   QString name() const;              // << Имена только: "COM1", "ttyS0" !!!
 
   void setPort(const SerialPortInfo &info);
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setRate(qint32 rate, Directions dir = Input | Output);
   qint32 rate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs = 0);
   int dataInterval() const;
 
   void setReadTimeout(int msecs = 0);
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush();
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
   DataErrorPolicy dataErrorPolicy() const;
 
   SerialError error() const;
   void unsetError();
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   SerialPortPrivate * const d_ptr;
 
   Q_DECLARE_PRIVATE(SerialPort)
   Q_DISABLE_COPY(SerialPort)
};
 
inline bool SerialPort::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALPORT_H
 
 

Только все SerialError можно/нужно заменить на PortError

SerialPortInfo
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORTINFO_H
#define SERIALPORTINFO_H
 
class SerialPort;
class SerialPortInfoPrivate;
 
class QSERIALDEVICE_EXPORT SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo &other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  SerialPortInfo& operator=(const SerialPortInfo &other);
  void swap(SerialPortInfo &other);
 
  QString name() const;           // << Имена только: "COM1", "ttyS0" !!!
  QString systemLocation() const; // << Системный путь только: "\\\\\\\\.\\\\COM24", "/dev/ttyS45" !!!
  QString description() const;    // << Описание: "Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const;   // << Производитель: "(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardRates() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate * const d_ptr;
};
 
#endif // SERIALPORTINFO_H
 
« Последнее редактирование: Июнь 17, 2011, 08:44 от kuzulis » Записан

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #451 : Июнь 17, 2011, 10:00 »

>>1. Как это сделать (добавить коммитером)?
А не надо комитеров. Есть механизм Merge Request. Им и надо пользоваться.

>>Но прежде чем заливать стоит выложить сюда окончательные версии интерфейсов для финальной ревизии
вобще-то для этого Git и придумали, ветку уже давно надо было сделать. Как-то вы всё по крестьянски пользуетесь современными технологиями
« Последнее редактирование: Июнь 17, 2011, 10:02 от lit-uriy » Записан

Юра.
b-s-a
Гость
« Ответ #452 : Июнь 17, 2011, 10:04 »

>>1. Как это сделать (добавить коммитером)?
А не надо комитеров. Есть механизм Merge Request. Им и надо пользоваться.

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

Сообщений: 2812


Просмотр профиля
« Ответ #453 : Июнь 17, 2011, 10:04 »

Цитировать
Перейти в Git Tk можно из Git GUI, Меню "Хранилище (репозиторий)" -> "Показать историю всех ветвей"

*Git GUI
Меню "Ветвь"->"Сздать"
вводишь название
указываешь начальную версию (ветвь от которой ветвится нужно)
Если хочешь сразу на неё перейти ставишь галку "после создания сделать текущей"

* в Git Tk (удобнее когда надо задним числом её сделать)
тычешь состояние, от которого хочешь ветвится
правой кнопкой вызываешь контекстное меню, в нём пункт "Создать ветвь" в открывшееся окно вводишь имя.
Всё, ветвь создана, если хочешь на неё перейти, тычешь правой кнопкой по имени ветви (зелёненькая подпись), а не по состоянию. В контекстном меню выбираешь "Перейти на эту ветвь" (Если выскакивает окно о типе перехода, то можно выбрать "Жёсткий" вариант, но не сохранённые изменения в рабочем каталоге будут потеряны)
Ну а при заливке этой ветви на сервер, выбирать именно эту ветвь, или "orig" и как-то там?
Записан

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #454 : Июнь 17, 2011, 10:07 »

>>выбирать именно эту ветвь
конечно. Выбираешь те ветви, которые отправить хочешь (можно сразу несколько).

П.С.
Не имей привычки переименовывать ветви и сбрасывать (reset/hard) их состояния, иначе будет проблема при отправке.
Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #455 : Июнь 17, 2011, 10:10 »

>>Для создания ветки этого недостаточно.
Пусть kuzulis сам делает, а то он уже столько времени на гиториусе, а ветки делать так и не научился.
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #456 : Июнь 17, 2011, 10:19 »

 Улыбающийся

имя ветки: future-integration пойдет?
Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #457 : Июнь 17, 2011, 10:23 »

Замечания по интерфейсам:
QSERIALDEVICE_EXPORT  - переименовать не надо?
setDataInterval(), setReadTimeout() - убрать дефолтные значения.
у обоих классов, думаю, name следует все-таки переименовать в portName. Дабы не было недоразумений (например, уже есть QFile::fileName).
отсутствует ~SerialPortInfo()
Может добавить метод SerialPortInfo::isValid(), который бы проверял порт на фактическое присутствие в системе?

kuzulis
Делай в консоли:
> cd Path\to\clone
> git checkout --orphan 2.0-t
> git rm *
> git commit -a
> git checkout --orphan 2.0 2.0-t
> git branch -D 2.0-t
> git push origin 2.0:refs/heads/2.0

Будет создана новая ПУСТАЯ (с пустой историей) ветка с именем 2.0

Цитировать
имя ветки: future-integration пойдет?
Слишком длинно. Можно назвать 2.0, ng (new generation), next...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #458 : Июнь 17, 2011, 10:39 »

Цитата: b-s-a
Замечания по интерфейсам:
QSERIALDEVICE_EXPORT  - переименовать не надо?
setDataInterval(), setReadTimeout() - убрать дефолтные значения.
у обоих классов, думаю, name следует все-таки переименовать в portName. Дабы не было недоразумений (например, уже есть QFile::fileName).
отсутствует ~SerialPortInfo()
Может добавить метод SerialPortInfo::isValid(), который бы проверял порт на фактическое присутствие в системе?

SerialPort
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORT_H
#define SERIALPORT_H
 
#include <QtCore/QIODevice>
 
class SerialPortPrivate;
 
class QSERIALPORT_EXPORT SerialPort : public QIODevice
{
   Q_OBJECT
 
   Q_PROPERTY(Rate rate READ rate WRITE setRate)
   Q_PROPERTY(DataBits dataBits READ dataBits WRITE setDataBits)
   Q_PROPERTY(Parity parity READ parity WRITE setParity)
   Q_PROPERTY(StopBits stopBits READ stopBits WRITE setStopBits)
   Q_PROPERTY(FlowControl flowControl READ flowControl WRITE setFlowControl)
   Q_PROPERTY(DataErrorPolicy dataErrorPolicy READ dataErrorPolicy WRITE setDataErrorPolicy)
   Q_PROPERTY(bool dtr READ dtr WRITE setDtr)
   Q_PROPERTY(bool rts READ rts WRITE setRts)
   Q_PROPERTY(SerialError error READ error RESET unsetError)
 
   Q_ENUMS( Directions Rate DataBits Parity StopBits FlowControl Lines DataErrorPolicy SerialError )
 
public:
 
   enum Direction  {
       Input = 1,
       Output = 2
   };
   Q_DECLARE_FLAGS(Directions, Direction)
 
   enum Rate {
       Rate1200 = 1200,
       Rate2400 = 2400,
       Rate4800 = 4800,  
       Rate9600 = 9600,
       Rate19200 = 19200,
       Rate38400 = 38400,  
       Rate57600 = 57600,
       Rate115200 = 115200,
       UnknownRate = -1
   };
 
   enum DataBits {
       Data5 = 5,
       Data6 = 6,
       Data7 = 7,
       Data8 = 8,
       UnknownDataBits = -1
   };
 
   enum Parity {
       NoParity = 0,
       EvenParity = 2,
       OddParity = 3,        
       SpaceParity = 4,
       MarkParity = 5,        
       UnknownParity = -1
   };
 
   enum StopBits {
       OneStop = 1,
       OneAndHalfStop = 3,
       TwoStop = 2,
       UnknownStopBits = -1
   };
 
   enum FlowControl {
       NoFlowControl,      
       HardwareControl,
       SoftwareControl,
       UnknownFlowControl = -1
   };
 
   enum Line {
       Le = 0x01,
       Dtr = 0x02,
       Rts = 0x04,
       St = 0x08,
       Sr = 0x10,
       Cts = 0x20,
       Dcd = 0x40,
       Ri = 0x80,
       Dsr = Le    
   };
   Q_DECLARE_FLAGS(Lines, Line)
 
   enum DataErrorPolicy {
       SkipPolicy,
       PassZeroPolicy,
       IgnorePolicy,
       StopReceivingPolicy
   };
 
   enum SerialError {
       NoError,                
       NoSuchDeviceError,          
       PermissionDeniedError,      
       DeviceAlreadyOpenedError,    
       DeviceIsNotOpenedError,      
       ParityError,
       IoError
   };
 
   explicit SerialPort(QObject *parent = 0);
   explicit SerialPort(const QString &name, QObject *parent = 0);
   explicit SerialPort(const SerialPortInfo &info, QObject *parent = 0);
   virtual ~SerialPort();
 
   void setPortName(const QString &name); // << Имена только: "COM1", "ttyS0" !!!
   QString portName() const;              // << Имена только: "COM1", "ttyS0" !!!
 
   void setPort(const SerialPortInfo &info);
 
   virtual bool open(OpenMode mode);
   virtual void close();
 
   bool setRate(qint32 rate, Directions dir = Input | Output);
   qint32 rate(Directions dir = Input | Output) const;
 
   bool setDataBits(DataBits dataBits);
   DataBits dataBits() const;
 
   bool setParity(Parity parity);
   Parity parity() const;
 
   bool setStopBits(StopBits stopBits);
   StopBits stopBits() const;
 
   bool setFlowControl(FlowControl flow);
   FlowControl flowControl() const;
 
   void setDataInterval(int usecs);
   int dataInterval() const;
 
   void setReadTimeout(int msecs);
   int readTimeout() const;
 
   bool dtr() const;
   bool rts() const;
 
   Lines lines() const;
 
   bool flush();
   virtual bool reset();
 
   void setDataErrorPolicy(DataErrorPolicy policy = IgnorePolicy);
   DataErrorPolicy dataErrorPolicy() const;
 
   SerialError error() const;
   void unsetError();
 
   virtual bool isSequential() const;
 
   virtual qint64 bytesAvailable() const;
   virtual qint64 bytesToWrite() const;
 
   virtual bool waitForReadyRead(int msecs);
   virtual bool waitForBytesWritten(int msecs);
 
public Q_SLOTS:
   bool setDtr(bool set);
   bool setRts(bool set);
   bool sendBreak(int duration = 0);
   bool setBreak(bool set = true);
   bool clearBreak(bool clear = true);
 
protected:
   virtual qint64 readData(char *data, qint64 maxSize);
   virtual qint64 writeData(const char *data, qint64 maxSize);
 
private:
   SerialPortPrivate * const d_ptr;
 
   Q_DECLARE_PRIVATE(SerialPort)
   Q_DISABLE_COPY(SerialPort)
};
 
inline bool SerialPort::clearBreak(bool clear)
{ return setBreak(!clear); }
 
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Directions)
Q_DECLARE_OPERATORS_FOR_FLAGS(SerialPort::Lines)
 
#endif // SERIALPORT_H
 

SerialPortInfo
Код
C++ (Qt)
/*
   License...
*/

 
#ifndef SERIALPORTINFO_H
#define SERIALPORTINFO_H
 
class SerialPort;
class SerialPortInfoPrivate;
 
class QSERIALPORT_EXPORT SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo &other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  virtual ~SerialPortInfo();
 
  SerialPortInfo& operator=(const SerialPortInfo &other);
  void swap(SerialPortInfo &other);
 
  QString portName() const;       // << Имена только: "COM1", "ttyS0" !!!
  QString systemLocation() const; // << Системный путь только: "\\\\\\\\.\\\\COM24", "/dev/ttyS45" !!!
  QString description() const;    // << Описание: "Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const;   // << Производитель: "(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  bool isExists() const;          // << Если порт фактически существует
  QList<int> standardRates() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate * const d_ptr;
};
 
#endif // SERIALPORTINFO_H
 

Цитировать
Слишком длинно. Можно назвать 2.0, ng (new generation), next...
Ок вечером, по москве, после 18:00 попробую Улыбающийся

Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #459 : Июнь 17, 2011, 10:59 »

>>нужна реализация позволяющая строго контролировать время приема/передачи данных.
Если речь идёт о приёме по таймаутам, то это не реально.
Т.к. система (в драйвере порта) не регистрирует время, в которое происходит прерывание от приёмника UARTа.
А это и не надо. Мне достаточно, чтобы waitForReadyRead и waitForBytesWritten работали не дольше, чем у них указано в параметрах.
Цитировать
твоя хотелка (а точнее конторская) - это частный узкоспециализированный случай, ИМХО, не стоит включать это в библиотеку.
Это сделать не так сложно. Под Windows просто для малых времен (менее 20 мс) необходимо делать ожидание на основе PrefomanceCounters и ::Sleep(0). И всё.
Цитировать
Тем более, не нужно использовать какие-то таймеры и т.п. которые будут неподецки грузить процессор.
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Цитировать
bool isExists() const;
Ты уверен в букве s на конце?
Мне не нравится. Так как список портов можно получить через метод availablePorts() (доступные порты), а потом проверять через "а существует ли он"?
Цитировать
SerialPortInfoPrivate * const d_ptr;
const лучше убрать, иначе будет сложно реализовать метод swap, ну и operator= соответственно (так как он через swap работает).
Цитировать
virtual ~SerialPortInfo();
Зачем тут виртуальный деструктор?!?  Шокированный
« Последнее редактирование: Июнь 17, 2011, 11:04 от b-s-a » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #460 : Июнь 17, 2011, 11:19 »

Цитировать
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Нет. Через QSocketNotifier/QWinEventNotifier, ИМХО.
Цитировать
Ты уверен в букве s на конце?
Мне не нравится. Так как список портов можно получить через метод availablePorts() (доступные порты), а потом проверять через "а существует ли он"?
Цитировать
SerialPortInfoPrivate * const d_ptr;
const лучше убрать, иначе будет сложно реализовать метод swap, ну и operator= соответственно (так как он через swap работает).
Ок. Уберу const и исправлю метод на isValid().

Цитировать
Зачем тут виртуальный деструктор?!?  Шокированный
Уберу virtual.  Улыбающийся


Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #461 : Июнь 17, 2011, 11:32 »

Цитировать
А как тогда грамотно реализовать сигнал readyRead()? Имхо, самый простой способ - через таймер.
Нет. Через QSocketNotifier/QWinEventNotifier, ИМХО.
Цитировать
Хорошо.
Уведомления о изменении состояния линий делать не будем?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #462 : Июнь 17, 2011, 11:53 »

Цитировать
Уведомления о изменении состояния линий делать не будем?
Не знаю, пока наверное нет.

Но если вдруг делать - то мои мысли такие :
(эти мысли относятся только к уведомлениям состояний линий CTS/DSR и т.п.!, т.е. это не относится к линиям Rx/Tx)

Делаем к примеру отдельный "приватный" класс - синглтон, который по таймеру проверяет состояние линий сразу у множества портов (по очереди).
Т.е. этот класс принимает дескрипторы портов (т.е. кидает их в свой список) и по таймеру проверяет состояния линий.
При изменении состояния линии этот класс емиттит сигнал в нужный SerialPort (тут еще нужно придумать механизм посылки сигнала нужному приемнику),
или же сделать типа broadcast, когда сигнал посылается всем SerialPort, но тот SerialPort, который имеет такой-же дескриптор, как и в сигнале обрабатывает этот сигнал.

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

Тем самым, у нас будет всего один таймер, который обрабатывает все дескрипторы которые имеются у него в списке.

Типа:
Код
C++ (Qt)
class LineNotifier: public QTimer
{
   Q_OBJECT
 
   ....
   ....
Q_SIGNALS:
   void linesState(Lines l, int fd);
 
public Q_SLOTS:
   ....
   void addDescriptor(int fd);
   void removeDescriptor(int fd);
 
private:
   QList<int> descriptorsList;
};
 

Как то так...
« Последнее редактирование: Июнь 17, 2011, 12:02 от kuzulis » Записан

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

Сообщений: 2812


Просмотр профиля
« Ответ #463 : Июнь 17, 2011, 18:25 »

2 b-s-a

Не получается создать ветку:

> cd Path\to\clone
1. Зашел + залогинился на gitorious
2. Скопировал адрес: git@gitorious.org:qserialdevice/qserialdevice.git
3. Открыл у себя Git GUI и склонировал репозиторий в D:/git/ng

> git checkout --orphan 2.0-ng
4. Ok

> git rm *
5. Тут написало, что не может удалить каталог examples (типо нужно рекурсивно удалять и писать '-r') и т.п,
поэтому я ввел: git rm -r *

> git commit -a
6. Тут выскочило окошко с VIM редактором, там был перечислен
перечень всех файлов проекта, закоментированный символом '#'.
Я всё удалил и написал: Initial commit..
И типа сохранил и вышел из VIM: Esc + ZZ

> git checkout --orphan 2.0 2.0-ng
7. Ok

> git branch -D 2.0-ng
8. Тут написало, что ветка  2.0-ng удалена.

> git push origin 2.0:refs/heads/2.0
Тут запросило passphrase для RSA. Я ввел свой пароль, с помощью которого я ранее через Git GUI комитил изменения.
Но оно подождало и через некоторое время написало:
Цитировать
error: src refspec 2.0 does not match any.
error: failed to push some refs to 'git@gitorious.org:qserialdevice/qserialdevice.git'
« Последнее редактирование: Июнь 17, 2011, 18:27 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #464 : Июнь 17, 2011, 21:13 »

повтори тоже самое, только пункты 7 и 8 моменяй местами
Записан
Страниц: 1 ... 29 30 [31] 32 33 ... 88   Вверх
  Печать  
 
Перейти в:  


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