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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: одновременное обновление активных элементов на центральном виджете приводит к ош  (Прочитано 24641 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Igors, повторюсь. Вы видимо не смотрели код.
Когда задаётся таймер с 0(нулевым) интервалом, идёт вызов  QMetaObject::invokeMethod.
Это Вы говорите о статическом методе (утилите) QTimer::singleShot. Но если Вы создали таймер с нулевым интервалом и сделали ему start, то событие будет получено через OC (даже если setSingleShot(true)).
Записан
Bepec
Гость
« Ответ #31 : Июль 19, 2012, 16:55 »

Если создать таймер и использовать метод singleShot - вызов пойдёт напрямую.

Если же использовать метод старт - в любом случае будет идти через систему.

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

Сообщений: 11445


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

Если создать таймер и использовать метод singleShot - вызов пойдёт напрямую.
Зачем создавать экземпляр если singleShot статический?

Этого я незнал, хотя бы из здравого смысла - не могу представить себе необходимым таймер в цикле с нулевым интервалом - прямой путь в лагамМ Улыбающийся
Это довольно популярный метод, многие приложения используют его (особенно что постарше). Эффект примерно тот же что и выполнение долгой операции в др потоке чтобы не замерзало UI. Плюсы в том что UI всегда под рукой, минусы - что единичная операция должна быть достаточно мелкой
Записан
Bepec
Гость
« Ответ #33 : Июль 19, 2012, 19:14 »

Вы открыли мне глаза. Я ж разбалован потоками и прочим Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Если создать таймер и использовать метод singleShot - вызов пойдёт напрямую.

Напрямую это как? ))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Bepec
Гость
« Ответ #35 : Июль 19, 2012, 19:58 »

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

Сообщений: 2901



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

pastor - исходник выложен на предыдущей странице Улыбающийся Вы в нём поймёте больше, чем я могу рассказать Веселый

Ну я там как раз и не увидел "прямого вызова". Я думаю QueuedConnection должен вам намекнуть ))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DmitryM
Гость
« Ответ #37 : Июль 19, 2012, 20:39 »

Ну а почему "лучше этого не делать" я тоже не понял
Образуется что-то типа forever, который работает через перегруженный EventLoop, т.е. на гране hotspot.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Образуется что-то типа forever, который работает через перегруженный EventLoop, т.е. на гране hotspot.
Ничего там не образуется, т.к. максимум 1 событие этого таймера может быть в EventLoop
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Причем этот ивент возникает исключительно тогда, когда event loop несодерджит других ивентов.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Bepec
Гость
« Ответ #40 : Июль 19, 2012, 21:57 »

Эх люди люди, когда ж читать начнёте? Улыбающийся

PS для не понявших цель - прочитать тему с самого начала и прекратить перепост уже обсуждённых вопросов Веселый
Записан
DmitryM
Гость
« Ответ #41 : Июль 20, 2012, 07:18 »

Причем этот ивент возникает исключительно тогда, когда event loop несодерджит других ивентов.
Цитировать
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.
Написано же, что обработка начинается после обработки событий менеджера окон, значит эвент помещается в очередь.
Не вериться, смотри реализацию для того же Windows.

Эх люди люди, когда ж читать начнёте? Улыбающийся

PS для не понявших цель - прочитать тему с самого начала и прекратить перепост уже обсуждённых вопросов Веселый
Вопрос был о существование OnIdle, на что Igors выдал QTimer с 0.

Вот QTimer с 0, который пожирает четверть процессора.
Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   connect(&m_timer, SIGNAL(timeout()), this, SLOT(timeoutSlot()));
 
   m_timer.start(0);
}
 
void Widget::timeoutSlot()
{
   static size_t t = 0;
   t++;
}
 
Widget::~Widget()
{
   delete ui;
}
 

Записан
Bepec
Гость
« Ответ #42 : Июль 20, 2012, 07:29 »

ДмитрийМ - вы ещё создайте пустой указатель и попытайтесь в него писать по этому таймеру Веселый Будет очень оригинальный пример ошибок программирования Веселый

Вы в данном случае просто забиваете очередь событий пустым слотом. Если в слоте исполнялось бы что-нибудь затратное по времени, эффект был бы другой. Аналогичный образом работают потоки.

Создаёте поток с бесконечным циклом, пустым - будут те же 25%(100% загрузка одного ядра, как я понимаю Веселый). А если в цикл добавить действия, то сработает как надо.

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

PS без здравого смысла любая программа может сожрать ваше процессорное время Веселый

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

Вы в данном случае просто забиваете очередь событий пустым слотом. Если в слоте исполнялось бы что-нибудь затратное по времени, эффект был бы другой.
Так ли это?  Подмигивающий
Подключай фантазию. Если этот код в GUI, то у тебя есть другие виджеты, который обрабатывают свои PaintEvent, MouseEvent и т. д. И все эти эвенты идут через очередь событий.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Июль 20, 2012, 11:20 »

Вопрос был о существование OnIdle, на что Igors выдал QTimer с 0.
Да, и что не так?

Вот QTimer с 0, который пожирает четверть процессора.
У меня он пожирает одно ядро полностью - ну так и надо если планировались какие-то активные действия в idle. А нет - никто не мешает отключить или поставить больший интервал.

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


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