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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: одновременное обновление активных элементов на центральном виджете приводит к ош  (Прочитано 24767 раз)
Bepec
Гость
« Ответ #15 : Июль 17, 2012, 16:55 »

Проще выражаясь - ошибку вы локализовали. Она у вас в той части, ез которой работает усё ок.

Дебаггер в руки и вперед!

PS ну или выкладывайте код.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Июль 17, 2012, 18:30 »

вот еще вопрос в эту же тему - есть ли в QT событие OnIdle () или его аналог?
QTimer с интервалом ноль.

Человеческий глаз не заметит мельканий раз в 5мс и прочего. Излишняя только работа.
Глаз и фотоны ловит, так что мелькание заметит. Другое дело что исходить надо из соображений плавности для чего 25 fps вполне гуд

Записан
DmitryM
Гость
« Ответ #17 : Июль 17, 2012, 20:13 »

вот еще вопрос в эту же тему - есть ли в QT событие OnIdle () или его аналог?
QTimer с интервалом ноль.
лучше такое не делать Подмигивающий
Записан
Bepec
Гость
« Ответ #18 : Июль 17, 2012, 20:27 »

Qtimer с интервалом в 0 напрямую вызывает функцию, минуя таймер и прочая, так что ничего плохого не случится.

PS Тролли фигней не особо страдали Улыбающийся
Записан
mutineer
Гость
« Ответ #19 : Июль 17, 2012, 20:27 »

вот еще вопрос в эту же тему - есть ли в QT событие OnIdle () или его аналог?
QTimer с интервалом ноль.
лучше такое не делать Подмигивающий

А можно аргументации? Интересно почему лучше такое не делать
Записан
DmitryM
Гость
« Ответ #20 : Июль 19, 2012, 12:56 »

Qtimer с интервалом в 0 напрямую вызывает функцию, минуя таймер и прочая, так что ничего плохого не случится.

PS Тролли фигней не особо страдали Улыбающийся
Да?
А это что:
Цитировать
The default value for this property is 0. A QTimer with a timeout interval of 0 will time out as soon as all the events in the window system's event queue have been processed.
Записан
Bepec
Гость
« Ответ #21 : Июль 19, 2012, 13:29 »

Это означает, что вызов функции будет добавлен в конец очереди сообщений окна. Проще выражаясь - прямой вызов функции.(правильный ответ в первом предложении)
« Последнее редактирование: Июль 19, 2012, 14:48 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июль 19, 2012, 14:17 »

Это означает, что вызов функции будет добавлен в конец очереди сообщений окна. Проще выражаясь - прямой вызов функции.
Прочитав этот пост я было подумал - ну щас ему дадут! "Не прочитал документацию!!!" и все такое.. Однако же - повешенная лапша успешно проходит  Улыбающийся

Никаких там "прямых" вызовов нет - это событие генерируемое системой и добавляемое в eventLoop как и остальные (напр мышиные). Ну там "события таймера имеют низший приоритет и.т.п. - песня известная

Ну а почему "лучше этого не делать" я тоже не понял
Записан
Bepec
Гость
« Ответ #23 : Июль 19, 2012, 14:23 »

Igors, скажите пожалуйста, если поставить бесконечный цикл и вызвать напрямую функцию, куда она пойдёт? Улыбающийся

Или вы скажете, что EventLoop ничего общего с очередью сообщений не имеет? Прошу, не сдерживайте себя, авось я чегой т полезного узнаю Веселый


update: исходнички форева Улыбающийся

Цитировать
void QTimer::singleShot(int msec, QObject *receiver, const char *member)
{
    if (receiver && member) {
        if (msec == 0) {
            // special code shortpath for 0-timers
            const char* bracketPosition = strchr(member, '(');
            if (!bracketPosition || !(member[0] >= '0' && member[0] <= '3')) {
                qWarning("QTimer::singleShot: Invalid slot specification");
                return;
            }
            QByteArray methodName(member+1, bracketPosition - 1 - member); // extract method name
            QMetaObject::invokeMethod(receiver, methodName.constData(), Qt::QueuedConnection);
            return;

        }
        (void) new QSingleShotTimer(msec, receiver, member);
    }
}
« Последнее редактирование: Июль 19, 2012, 14:35 от Bepec » Записан
mutineer
Гость
« Ответ #24 : Июль 19, 2012, 14:43 »

update: исходнички форева Улыбающийся

Ну да, постит сообщение в EventLoop. А под "прямой вызов" большинство программистов небезосновательно понимают вызов метода прям отсюда. Вызов при помощи сообщения в EventLoop это несколько другое же
Записан
Bepec
Гость
« Ответ #25 : Июль 19, 2012, 14:46 »

Ну таки да, погорячился с прямым вызовом, но ранее ответил правильно - ставит в очередь Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Июль 19, 2012, 14:56 »

Вот стек вызовов (аттач). Ясно видно что "ноги растут" от ОС (СFRun..), приложение получило событие от него. Причем здесь какой-то "прямой вызов"?
Записан
Bepec
Гость
« Ответ #27 : Июль 19, 2012, 15:09 »

Igors, да я немного оговорился про прямой вызов(сгоряча, не спорю Веселый ). В очередь сообщений ставит.

Смотри выше исходники.

Мб у вас система такая или я чего-то недопонимаю, но timeout'a при нулевом интервале у вас быть не должно. На винде 7 x64 во всяком случае, идёт обычный QMetaObject::invokeMethod.

Аналогично вызову слота с QueuedConnection. 
« Последнее редактирование: Июль 19, 2012, 15:13 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Июль 19, 2012, 15:27 »

Мб у вас система такая или я чего-то недопонимаю, но timeout'a при нулевом интервале у вас быть не должно. На винде 7 x64 во всяком случае, идёт обычный QMetaObject::invokeMethod.
Должен быть, ведь идея в том что приложение получает idle когда нет др событий - значит хоть раз ОС должен "прокачать" события. Просто ставите break в слоте таймера и смотрите стек. А invokeMethod может иметь место, но только после того как событие получено от ОС. То уже личное дело Qt как распорядиться полученным
Записан
Bepec
Гость
« Ответ #29 : Июль 19, 2012, 15:30 »

Igors, повторюсь. Вы видимо не смотрели код.
Когда задаётся таймер с 0(нулевым) интервалом, идёт вызов  QMetaObject::invokeMethod.

Сигнал timeOut в данном случае не вызывается. Проверил только что на своей машине.
Если интервал более 0, то ставится обычный виндовый таймер.
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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