Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jurtal от Ноябрь 25, 2011, 13:20



Название: Останавливается таймер
Отправлено: jurtal от Ноябрь 25, 2011, 13:20
Всем привет. Столкнулся со следующей проблемой:
В какой-то момент запущенный таймер останавливается (QTimer).
Частота срабатываний 10мсек, не синглшот.
После каких-то манипуляций на формочке (слайдер пошевелить или еще чего ) обработчик сигналов от таймера перестает срабатывать.

Причина непонятна.
Если у кого есть идеи - почему такое может быть - пожалуйста поделитесь..


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 25, 2011, 13:21
Код. Формочки и таймера. Желательно полный.


Название: Re: Останавливается таймер
Отправлено: jurtal от Ноябрь 25, 2011, 13:29
Код к сожалению не получится - очень большое приложение. Чисто теоретически есть идеи по какой причине он может останавливаться?


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 25, 2011, 13:37
Диавольские баги отняли у меня шлем СУПЕР-телепата к сожалению.

По теме:
Чисто теоретически может блокироваться форма и перестает реагировать на данный сигнал.
Чисто функционально таймер в какой то момент может просто удаляться.
Чисто распростроняясь обработчик таймера у вас начит неправильный

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

Смысл поста -  вырезать кусок создания таймера и слот на его срабатывания и выложить.


Название: Re: Останавливается таймер
Отправлено: jurtal от Ноябрь 25, 2011, 13:54
Да не - вырезать нетрудно...
Однако  очень маленькая вероятность, что это может вылечить мою программу.
У меня происходит в 4.7.1 нечто подобное...
 https://bugreports.qt.nokia.com/browse/QTBUG-11642?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab


// Создание
....
m_timerSlow = new QTimer(this);
if(m_timerSlow != NULL)
{
    connect(m_timerSlow, SIGNAL(timeout()), this, SLOT(onTimerSlow()));
}
......


//
void Manager::timerSlowStart(int interval)
{
    if((m_timerSlow != NULL) && (interval > 0))
    {
      m_timerSlow->start(interval);   
    }
}
//
void Manager::timerSlowStop()
{
    if(m_timerSlow != NULL)
    {
        m_timerSlow->stop();
    }
}

//
void Manager::onTimerSlow()
{
    updateAll();   
}


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 25, 2011, 14:04
Страшно мне смотреть на сие. Каждый раз проверяться на наличие таймера, это ммм... осторожен ты однако, или программа у тебя без проекта :)

Да и странно, НО твоя проверка не работает :( вообще никак.

Она проверяет наличие у тебя указателя, а не присутствия в указателе ссылки.

(Хотел у тебя стырить эту проверку на наличие, но увы, она нерабочая, а то бы пригодилась.)

Вкратце - ты проверяешь, есть ли у тебя указатель.

Не видя текста программы, я могу сказать лишь одно - тебе нужно ее перерабатывать.


Название: Re: Останавливается таймер
Отправлено: jurtal от Ноябрь 25, 2011, 14:23
Один тоже умный человек сказал нечто подобное много лет назад.... У тебя ошибка - и я знаю что делать... Тебе нужно ее исправить... :)


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 25, 2011, 14:38
ну. скажем так - указатель у тебя ведь является полем класса?

Объявлен в private:/public: где то? Объявлен глобальной переменной?

И все твои условия которые я видел - всегда будут выдавать true.

PS увидев такую проверку я сразу же в своей программе наподобие сотворил только с указателем на поток :)
И убедился в бесполезности проверки.


Название: Re: Останавливается таймер
Отправлено: jurtal от Ноябрь 25, 2011, 14:48
Согласен. Ты прав. Вот только проблема таймера здесь непричем. Похоже это баг Qt. Я не вижу причин для внезапной остановки таймера... Нашел описание того, что происходит у меня.
https://bugreports.qt.nokia.com/browse/QTBUG-11642?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab

В любом случае спасибо за комментарии и помощь.


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 25, 2011, 14:52
А вот тут ты неправ ) Там же ясно написано что глюк имеет место быть только с OpenGl компонентой :)

PS сам решай, стоит ли пытаться решить проблему, или махнуть рукой. (я лично с таймерами норм лажу пока что );


Название: Re: Останавливается таймер
Отправлено: andrew.k от Ноябрь 25, 2011, 16:19
Страшно мне смотреть на сие. Каждый раз проверяться на наличие таймера, это ммм... осторожен ты однако, или программа у тебя без проекта :)

Да и странно, НО твоя проверка не работает :( вообще никак.

Она проверяет наличие у тебя указателя, а не присутствия в указателе ссылки.

(Хотел у тебя стырить эту проверку на наличие, но увы, она нерабочая, а то бы пригодилась.)

Вкратце - ты проверяешь, есть ли у тебя указатель.

Не видя текста программы, я могу сказать лишь одно - тебе нужно ее перерабатывать.
Что такое шизофазия (http://ru.wikipedia.org/wiki/Шизофазия)?


Название: Re: Останавливается таймер
Отправлено: andrew.k от Ноябрь 25, 2011, 16:21
PS увидев такую проверку я сразу же в своей программе наподобие сотворил только с указателем на поток :)
И убедился в бесполезности проверки.
Я тут накидал для тебя набор правил)

Правило №1: Всегда инициализируй переменные!
Правило №2: Если ты не знаешь зачем это нужно, просто следуй правилу один.


Название: Re: Останавливается таймер
Отправлено: GreatSnake от Ноябрь 25, 2011, 17:11
Что делает updateAll() и каково значение interval?


Название: Re: Останавливается таймер
Отправлено: andrew.k от Ноябрь 25, 2011, 17:27
If Qt is unable to deliver the requested number of timer clicks, it will silently discard some.

О. как.
А если увеличить интервал до 50мс?
Если с таким интервалом все хорошо работает, то очевидно, что в коде все в порядке.


Название: Re: Останавливается таймер
Отправлено: Bepec от Ноябрь 28, 2011, 07:01
andrew.k Шизофазия не имеет ко мне отношения :) там же написано фразы без смысла должны быть.

По поводу советов - в программе использующей n+1 потоков, возможны аварийные ситуации, и соответственно нужна проверка на наличие указателя на поток.

PS спустись с небес на землю и не суди всех как бог.