Название: Останавливается таймер Отправлено: 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 спустись с небес на землю и не суди всех как бог. |