Russian Qt Forum

Qt => Общие вопросы => Тема начата: blood_shadow от Май 11, 2011, 22:46



Название: Не заканчивается таймер
Отправлено: blood_shadow от Май 11, 2011, 22:46
есть объект Pop3ConnectionObject который живет в другом потоке, и все его слоты выполняются
в том же потоке, создал таймер член данного класса:
Код
C++ (Qt)
QBasicTimer timer;
 
а также переопределил событие таймера:
Код
C++ (Qt)
void Pop3ConnectionObject::timerEvent(QTimerEvent *event)
{
   qDebug() << "Time Elapsed";
   timer.stop();
   qDebug() << "Timer is active_1 -> " << timer.isActive();
   QObject::timerEvent(event);
}
 
тоесть я с него сделал сингл-шот таймер
далее в коде запускаю таймер:
Код
C++ (Qt)
while (timer.isActive())
{
   QCoreApplication::processEvents();
   qDebug() << "Timer is active_2 -> " << timer.isActive();
}
 

Проблема в том что таймер не останавливается qDebug() << "Timer is active_1 -> " << timer.isActive();
выводит false, qDebug() << "Timer is active_2 -> " << timer.isActive(); выводит true, что вообще за хрень
может быть?  ???


Название: Re: Не заканчивается таймер
Отправлено: merke от Май 12, 2011, 06:14
Опиши ка для чего тебе это? может есть другое решение...


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 09:40
Опиши ка для чего тебе это? может есть другое решение...
я хотел сделать попытка чтения с сервера большого файла(~20Мб), одним
Код
C++ (Qt)
while(!sslSocket.atEnd())
{
   line = sslSocket.readLine();
   mailContent.append(line);
}
 
 
тут не обойтись, данные могут прийти после не выполнения условия цикла, алгоритм хочу реализовать такой:

Код:
while(!10 минут прошло)
{
    while(!sslSocket.atEnd())
    {
         line = sslSocket.readLine();
         mailContent.append(line);
    }
}


Название: Re: Не заканчивается таймер
Отправлено: Пантер от Май 12, 2011, 09:45
bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 )


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 09:53
bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 )
не подойдет, когда большой файл, сервер иногда шлет кусками, и получается считование
происходит быстрее чем новый кусок придет или например сервер послал кусок waitForReadyRead
вернуло управление, потом секундный перебой в связи и мы как-бы все данные считали но это был
только их кусок
в любом случае надо гарантировано дать примерно 10 сек. ожидания


Название: Re: Не заканчивается таймер
Отправлено: Пантер от Май 12, 2011, 09:57
Что мешает по нормальному сделать, то есть реагировать на сигнал void   readyRead ()?


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 09:58
Что мешает по нормальному сделать, то есть реагировать на сигнал void   readyRead ()?
синхронный режим  :)


Название: Re: Не заканчивается таймер
Отправлено: Пантер от Май 12, 2011, 10:00
while (true) {
..........
sleep (someTime);
}


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 10:04
while (true) {
..........
sleep (someTime);
}
сделал с помощью обычного таймера, но ща попробую разобраться с QBasicTimer, если это баг
запостю на баг трекер


Название: Re: Не заканчивается таймер
Отправлено: Авварон от Май 12, 2011, 11:30
И вас там радостно пошлют:)


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 12:39
нет там никакого бага, есть только моя невнимательность, вот рабочее решение:
Код
C++ (Qt)
timer.start(B_TIMEOUT, this);
 
while (timer.isActive())
{
   while(!sslSocket.atEnd())
   {
        line = sslSocket.readLine();
        if (line == ".\r\n" && posLine == "\r\n")
        {
            endReached = true;
            timer.stop();
        }
        posLine = line;
        mailContent.append(line);
   }
 
   QCoreApplication::processEvents();          
}
 
и таймер ивент соответственно:
Код
C++ (Qt)
void Pop3ConnectionObject::timerEvent(QTimerEvent *event)
{
   timer.stop();
}
 

if (line == ".\r\n" && posLine == "\r\n") - условие передачи всего сообщения,
пустая строка за которой идет . на линию


Название: Re: Не заканчивается таймер
Отправлено: Авварон от Май 12, 2011, 14:56
Бред. Почему нельзя циклом крутить waitForReadyRead пока не считаем все целиком?


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 15:32
Бред. Почему нельзя циклом крутить waitForReadyRead пока не считаем все целиком?
см. 3 пост, ситуация такова что данные могут не сразу прийти и при считывании мы можем достигнуть
конца быстрее чем они появятся


Название: Re: Не заканчивается таймер
Отправлено: merke от Май 12, 2011, 16:49
Автор мудрите вы что то очень. пересмотрите решение.
А тема смешно звучит, как будто длииииный таймер такой и всё и не заканчивается и не заканчивается=)


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 17:23
Автор мудрите вы что то очень. пересмотрите решение.
А тема смешно звучит, как будто длииииный таймер такой и всё и не заканчивается и не заканчивается=)
я пробовал сначала сделать в цикле waitForReadyRead() но по истечению не которого времени,
ф-ция возращает false даже если есть данные в сокете, увы это баг - http://bugreports.qt.nokia.com/browse/QTBUG-14975


Название: Re: Не заканчивается таймер
Отправлено: Авварон от Май 12, 2011, 23:41
У вас есть ЯВНОЕ уловие выхода:
if (line == ".\r\n" && posLine == "\r\n")
Пока оно не выполнено - читать циклом несмотря на то что возвращает вейт фор реди рид.


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 23:49
Пока оно не выполнено - читать циклом несмотря на то что возвращает вейт фор реди рид.
это все понятно, но что делать если сервер связь отрубил во время передачи или пользователь захотел
вырубить программу? код то синхронный никакого сигнал - слот отношения нету
или еще одна ситуация куда хуже - сервер вовсе не отвечает или при медленном соединении
будет 20 мб полчаса передавать


Название: Re: Не заканчивается таймер
Отправлено: blood_shadow от Май 12, 2011, 23:56
а вот такой еще вопрос - можно ли как-то создать таймер который будет обходить
Qt-очередь событий, смотрел таймеры с винапи, но они принимают хендл окна, как с ними
напрямую связаться минуя очередь?
то есть мне нужен такой алгоритм:
запустил таймер на 10сек, который работает независимо от обработки событий Qt
и после 10 сек он сам остановится без processEvents()


Название: Re: Не заканчивается таймер
Отправлено: Авварон от Май 13, 2011, 00:17
Нет. Я вообще не понимаю что у вас там за жесть такая. Если сервер не ответил за время, указанное в waitForBytesWritten, надо спросить юзера - ретрай? Что ф-ия возвращает false это не косяк