crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
gpepsi
  опции профиля:
сообщение 12.7.2012, 16:58
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу реализовать наследника QIODevice. Посмотрел QLocalSocket, но что-то там слишком все мудро.
У меня устройство, с которым я могу работать через CreateFile, ReadFile, WriteFile.

Для того, чтобы использовать waitForReadyRead - устройство открываю в асинхронном режиме.
Переопределил методы
    virtual void close            (void) {...}
    virtual bool open            (OpenMode mode) {...}
    virtual bool isSequential        (void) const { retrun true; }
    virtual bool canReadLine        (void) const { return false; }


Теперь про
    virtual qint64 bytesAvailable    (void) const;
    virtual qint64 bytesToWrite        (void) const;

Я не хочу использовать буферизацию. Для них можно использовать GetOverlappedResult, но этот метод можно
испозовать, только если операция ввода-вывода уже началась.

Теперь ожидание
    virtual bool waitForBytesWritten(int msecs = 30000);
    virtual bool waitForReadyRead    (int msecs = 30000);


Для них нужно заводить 2 OVERLAPPED (на чтение и запись). Ожидать можно на WaitForSingleObject. Но эта функция тоже
используется на начатой операции ввода-вывода.

Как правильно написать код, чтоб можно было бы использовать типа
while(waitForReadyRead(...))
{
    qint64 bytes = bytesAvailable();
    QByteArray buffer(bytes, 0);
    qint64 readBytes = read(buffer.data(), buffer.size());
    ...
}


То есть операция ожидания раньше чем операция опроса состояния и операция чтения.

З.Ы. Я тут подумал, если процесс записи примерно такой.
write(...);
waitForBytesWritten(...);
bytesToWrite(...);

то вроде все логично получается
1. запускаем операцию ввода-вывода
2. Ожидаем запись по таймауту
3. Проверяем сколько записали если необходимо

А вот со чтением сложнее - сначала нужно узнать, что данные есть и сколько. А это получается нельзя сделать до запуска операции ввода-вывода

Сообщение отредактировал gpepsi - 12.7.2012, 19:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gpepsi
  опции профиля:
сообщение 20.7.2012, 9:17
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


никто не далал чтоли ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 20.7.2012, 16:34
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


То что ты описал, будет работать только под виндой.

Я думаю, что раз ты хочешь асинхронности и пользуешься Qt, то используй механизм сигналов и слотов, который и так асинхронный.
Для ожидания вызываешь:
connect( myDevice, SIGNAL(readyRead()), this, SLOT(myReadyRead()));
А уже в myReadyRead делаешь всё то, что хочешь делать при поступлении данных...

И не нужно будет городить огород...

Или я тебя не так понял?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gpepsi
  опции профиля:
сообщение 20.7.2012, 20:28
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 31.3.2010
Пользователь №: 1582

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 20.7.2012, 17:34) *
Или я тебя не так понял?

Цитата(ViGOur @ 20.7.2012, 16:34) *
Или я тебя не так понял?

ну хотелось бы этот объект использовать в отдельном потоке.
Да и как ожидать данные, если чтения еще не началось.

То есть логика как как я приводил
while(waitForReadyRead(...))
{
    qint64 bytes = bytesAvailable();
    QByteArray buffer(bytes, 0);
    qint64 readBytes = read(buffer.data(), buffer.size());
    ...
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 21.7.2012, 9:10
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(gpepsi @ 20.7.2012, 21:28) *
ну хотелось бы этот объект использовать в отдельном потоке.
ты объект можешь создать в новом потоке и в нем же и обрабатывать сигналы и слоты.

Цитата(gpepsi @ 20.7.2012, 21:28) *
Да и как ожидать данные, если чтения еще не началось.
Ожидание у тебя будет не явным, а средствами самого Qt, как только данные придут у тебя сработает слот, в котором ты можешь выполнить свои:
qint64 bytes = bytesAvailable();
QByteArray buffer(bytes, 0);
qint64 readBytes = read(buffer.data(), buffer.size());
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.6.2025, 22:29