Отправляет email-рассылки с помощью сервиса Sendsay

Обновление графического окна в Qt

Всем привет!!! :-)

Помогите решить следующую проблему... Она, в общем, классическая, но её
классические решения не помогают.

Есть графическое окно некоторого приложениея в Qt. Пока приложение
выполняется, окно не реагирует на действия пользователя. Проблема должна
решаться периодическим вызовом из приложения конструкции

Что делать, не знаю...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27605; Возраст листа: 1118; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581194

Ответить   Wed, 16 Aug 2006 18:08:56 +0400 (#581194)

 

Ответы:

16 августа 2006 18:08, Роман написал(а):

Найдите в сети книгу Жасмин Бланшетт и почитайте как это сделать правильно для
приложений, когда не нужен замороженный интерфейс. :)

Ответить   Wed, 16 Aug 2006 17:15:11 +0400 (#581213)

 

для

Читал Jasmin Blanchette, Mark Summerfield "Разработка графического
интерфейса с помощью библиотеки Qt3". Это она? Если да, то в ней
говорится только о qApp->processEvents(). Но этот способ не помогает.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27613; Возраст листа: 1118; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581234

Ответить   Wed, 16 Aug 2006 20:21:24 +0400 (#581234)

 

В сообщении от 16 августа 2006 18:08 Роман написал(a):

Вообще-то QCoreApplication::processEvents() помогает, только
надо его вызывать не реже чем 5 раз в секунду.

Еще можно длительную работу делать в отдельном треде, только
это весьма хлопотно

Ответить   "Sergey B. Khvatov" Wed, 16 Aug 2006 17:25:04 +0400 (#581218)

 

Sergey B. Khvatov wrote:

Вы где такой класс нашли? У меня в Qt 3.3.4 его нет. Наверно просто
QApplication, но я его и использую.

Насчет 5 раз. Если дело обстоит так: пользователь, например, нажимает
кнопку Maximize на окне. Этот сигнал от нажатия поступает в очередь, и я
его обрабатываю функцией QCoreApplication::processEvents() через 2
секунды, например. Он ведь должен обработаться, а у меня так не
происходит. Этот сигнал обрабатывается только после окончания работы
основной программы. А 5 раз, наверно, связано с динамикой отклика? Так
или нет? Что вы имели в виду. Объясните, пожалуйста, подробнее, если не
трудно.

Многопоточность в моем приложении не имеет смысла: оно работает с модемом.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27612; Возраст листа: 1118; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581233

Ответить   Wed, 16 Aug 2006 20:31:52 +0400 (#581233)

 

В сообщении от 16 августа 2006 20:31 Роман написал(a):

В Qt4. Он там - под QApplication (а еще static)

Это, но не только. В Qt3 processEvents() обрабатывает не все
события, а сколько успеет за 3 секунды (об этом
недвусмысленно написано в документации)

Так что используйте hasPendingEvents():
while (qApp->hasPendingEvents ()) qApp->processEvents ();

В Qt4 этим можно управлять, более того, по умолчанию
обрабатываются все события.

Вот в одном треде работает с модемом, а в другом обслуживает
GUI. Нормальный дизайн любого GUI приложения

Ответить   "Sergey B. Khvatov" Thu, 17 Aug 2006 10:24:50 +0400 (#581348)

 

Sergey B. Khvatov wrote:

Еще один вариант - работа с модемом в отдельном процессе (запускается
классом QProcess), а обмен с GUI через слот-сигнальный механизм. Этот
вариант интересен тем, что процесс работы с модемом можно запустить на
одном компе сетки, а управлять им через GUI, запущенный на другом (и
даже в общем случае - через ИНТЕРНЕТ).

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27617; Возраст листа: 1119; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581389

Ответить   Thu, 17 Aug 2006 13:09:35 +0400 (#581389)

 

Andrej Soloviev wrote:

Так ведь GUI связан с модемом. Какой толк параллелить, если модем может
работать только с одним процессом. Т. е. запусакем через GUI один
процесс, а дальше все - ждем пока модем его обработает. Важно, чтобы
базовые элементы GUI, например, перерисовка работали.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27619; Возраст листа: 1119; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581459

Ответить   Thu, 17 Aug 2006 20:17:18 +0400 (#581459)

 

Роман wrote:

Так не будет перерисовки, пока Вы не вернете управление в главный
событийный цикл (это тот, который запускается от app.exec(). И события
обрабатываться тоже не будут, поэтому у Вас тот предложенный цикл по
хвосту необработанных событий и зацикливался.
Есть, правда, искусственный способ - через QProgressBarDialog, но вряд
ли он Вас устроит.

А разделение блока работы с модемом и блока GUI на разные треды или
процессы как раз и позволяет в блоке GUI быстро обработав событие или
сигнал, вернуть управление в главный событийный цикл для обработки
следующего элемента очереди событий (к которым, кстати, также относится
перерисовка). Вот так, и никак иначе в третьем Qt не получится.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27622; Возраст листа: 1119; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581492

Ответить   Thu, 17 Aug 2006 21:45:03 +0400 (#581492)

 

Andrej Soloviev wrote:

Неправда. qApp->processEvents() приводит к обработке всех событий в
очереди. Ведь qApp - глобальная переменная. Во всяком случае - для
остальных элементов GUI, кроме QProgressBar обновление происходит нормально.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27630; Возраст листа: 1120; Участников: 1698
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581754

Ответить   Fri, 18 Aug 2006 20:51:08 +0400 (#581754)

 

Sergey B. Khvatov wrote:

Я навел справки - он для консольных приложений

У меня после ввода этой конструкции происходит зацикливание на этом
месте. Хотя все вроде очевидно...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27620; Возраст листа: 1119; Участников: 1697
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581460

Ответить   Thu, 17 Aug 2006 20:27:23 +0400 (#581460)

 

В сообщении от 17 августа 2006 20:27 Роман написал(a):

Он базовый для QApplication. Просто метод принадлежит ему.

Значит обработка накопленных событий вызывает новые события
и так до бесконечности. Что-то у вас не то со структурой
приложения - поэтому просто processEvents() и не хватает.

Ответить   "Sergey B. Khvatov" Fri, 18 Aug 2006 10:36:41 +0400 (#581580)

 

Sergey B. Khvatov wrote:

Это происходит после обновления строки прогресса:
QProgressBar::setProgresss(int ,int). После этого ставлю
processEvents(), и происходит зацикливание. Для остальных элементов GUI:
QListView, QIconView и др. обновление идет нормально.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27631; Возраст листа: 1120; Участников: 1698
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/581755

Ответить   Fri, 18 Aug 2006 20:46:59 +0400 (#581755)

 

В сообщении от Среда 16 Август 2006 19:31 Роман написал(a):

Это Вы зря, многопоточность решит проблемы с откликами и подвисаниями ГУИ!

Ответить   Поветкин Константин Thu, 24 Aug 2006 14:46:57 +0300 (#583517)

 

В сообщении от Среда 16 Август 2006 17:08 Роман написал(a):

If you think of MS-DOS as mono, and Windows as stereo,
then Linux is Dolby Digital and all the music is free...

I am the "ILOVEGNU" signature virus. Just copy me to your signature.
This email was infected under the terms of the GNU General Public License.

Software is like sex: it's better when it's free Linus Torvalds

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 27674; Возраст листа: 1126; Участников: 1707
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/583515

Ответить   Поветкин Константин Thu, 24 Aug 2006 14:44:46 +0300 (#583515)