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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


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