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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не заканчивается таймер  (Прочитано 7157 раз)
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, что вообще за хрень
может быть?  Непонимающий
Записан
merke
Гость
« Ответ #1 : Май 12, 2011, 06:14 »

Опиши ка для чего тебе это? может есть другое решение...
Записан
blood_shadow
Гость
« Ответ #2 : Май 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);
    }
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 12, 2011, 09:45 »

bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 )
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #4 : Май 12, 2011, 09:53 »

bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 )
не подойдет, когда большой файл, сервер иногда шлет кусками, и получается считование
происходит быстрее чем новый кусок придет или например сервер послал кусок waitForReadyRead
вернуло управление, потом секундный перебой в связи и мы как-бы все данные считали но это был
только их кусок
в любом случае надо гарантировано дать примерно 10 сек. ожидания
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 12, 2011, 09:57 »

Что мешает по нормальному сделать, то есть реагировать на сигнал void   readyRead ()?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #6 : Май 12, 2011, 09:58 »

Что мешает по нормальному сделать, то есть реагировать на сигнал void   readyRead ()?
синхронный режим  Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Май 12, 2011, 10:00 »

while (true) {
..........
sleep (someTime);
}
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
blood_shadow
Гость
« Ответ #8 : Май 12, 2011, 10:04 »

while (true) {
..........
sleep (someTime);
}
сделал с помощью обычного таймера, но ща попробую разобраться с QBasicTimer, если это баг
запостю на баг трекер
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Май 12, 2011, 11:30 »

И вас там радостно пошлют:)
Записан
blood_shadow
Гость
« Ответ #10 : Май 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") - условие передачи всего сообщения,
пустая строка за которой идет . на линию
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Май 12, 2011, 14:56 »

Бред. Почему нельзя циклом крутить waitForReadyRead пока не считаем все целиком?
Записан
blood_shadow
Гость
« Ответ #12 : Май 12, 2011, 15:32 »

Бред. Почему нельзя циклом крутить waitForReadyRead пока не считаем все целиком?
см. 3 пост, ситуация такова что данные могут не сразу прийти и при считывании мы можем достигнуть
конца быстрее чем они появятся
Записан
merke
Гость
« Ответ #13 : Май 12, 2011, 16:49 »

Автор мудрите вы что то очень. пересмотрите решение.
А тема смешно звучит, как будто длииииный таймер такой и всё и не заканчивается и не заканчивается=)
Записан
blood_shadow
Гость
« Ответ #14 : Май 12, 2011, 17:23 »

Автор мудрите вы что то очень. пересмотрите решение.
А тема смешно звучит, как будто длииииный таймер такой и всё и не заканчивается и не заканчивается=)
я пробовал сначала сделать в цикле waitForReadyRead() но по истечению не которого времени,
ф-ция возращает false даже если есть данные в сокете, увы это баг - http://bugreports.qt.nokia.com/browse/QTBUG-14975
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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