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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Останавливается таймер  (Прочитано 5887 раз)
jurtal
Гость
« : Ноябрь 25, 2011, 13:20 »

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

Причина непонятна.
Если у кого есть идеи - почему такое может быть - пожалуйста поделитесь..
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 25, 2011, 13:21 »

Код. Формочки и таймера. Желательно полный.
Записан
jurtal
Гость
« Ответ #2 : Ноябрь 25, 2011, 13:29 »

Код к сожалению не получится - очень большое приложение. Чисто теоретически есть идеи по какой причине он может останавливаться?
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 25, 2011, 13:37 »

Диавольские баги отняли у меня шлем СУПЕР-телепата к сожалению.

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

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

Смысл поста -  вырезать кусок создания таймера и слот на его срабатывания и выложить.
Записан
jurtal
Гость
« Ответ #4 : Ноябрь 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();   
}
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 25, 2011, 14:04 »

Страшно мне смотреть на сие. Каждый раз проверяться на наличие таймера, это ммм... осторожен ты однако, или программа у тебя без проекта Улыбающийся

Да и странно, НО твоя проверка не работает Грустный вообще никак.

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

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

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

Не видя текста программы, я могу сказать лишь одно - тебе нужно ее перерабатывать.
Записан
jurtal
Гость
« Ответ #6 : Ноябрь 25, 2011, 14:23 »

Один тоже умный человек сказал нечто подобное много лет назад.... У тебя ошибка - и я знаю что делать... Тебе нужно ее исправить... Улыбающийся
Записан
Bepec
Гость
« Ответ #7 : Ноябрь 25, 2011, 14:38 »

ну. скажем так - указатель у тебя ведь является полем класса?

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

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

PS увидев такую проверку я сразу же в своей программе наподобие сотворил только с указателем на поток Улыбающийся
И убедился в бесполезности проверки.
Записан
jurtal
Гость
« Ответ #8 : Ноябрь 25, 2011, 14:48 »

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

В любом случае спасибо за комментарии и помощь.
Записан
Bepec
Гость
« Ответ #9 : Ноябрь 25, 2011, 14:52 »

А вот тут ты неправ ) Там же ясно написано что глюк имеет место быть только с OpenGl компонентой Улыбающийся

PS сам решай, стоит ли пытаться решить проблему, или махнуть рукой. (я лично с таймерами норм лажу пока что );
Записан
andrew.k
Гость
« Ответ #10 : Ноябрь 25, 2011, 16:19 »

Страшно мне смотреть на сие. Каждый раз проверяться на наличие таймера, это ммм... осторожен ты однако, или программа у тебя без проекта Улыбающийся

Да и странно, НО твоя проверка не работает Грустный вообще никак.

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

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

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

Не видя текста программы, я могу сказать лишь одно - тебе нужно ее перерабатывать.
Что такое шизофазия?
Записан
andrew.k
Гость
« Ответ #11 : Ноябрь 25, 2011, 16:21 »

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

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

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Ноябрь 25, 2011, 17:11 »

Что делает updateAll() и каково значение interval?
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #13 : Ноябрь 25, 2011, 17:27 »

If Qt is unable to deliver the requested number of timer clicks, it will silently discard some.

О. как.
А если увеличить интервал до 50мс?
Если с таким интервалом все хорошо работает, то очевидно, что в коде все в порядке.
Записан
Bepec
Гость
« Ответ #14 : Ноябрь 28, 2011, 07:01 »

andrew.k Шизофазия не имеет ко мне отношения Улыбающийся там же написано фразы без смысла должны быть.

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

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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