LINUX.ORG.RU

[qt3] форма вне основного GUI потока


0

0

пусть есть кнопка, по нажатию на которую производятся какието долгие действия (например запросы к БД или просто sleep)
т.к. интерфейс при этом "замирает", то хочу вывести форму типа "Ждите ..."
делать это средствами qt в обработчике кнопки не получится - не кому будет обновлять ее
думаю надо рисовать в обход qt (в другом потоке)
возможно ли это? может уже есть готовые правильные решения?

★★★★★

А не будет ли более логичным в другом потоке выполнять "какието долгие действия"?

narayan
()

>рисовать в обход qt (в другом потоке) >возможно ли это?

Нет.

man GUI thread

summatus
()
Ответ на: комментарий от Begemoth

в другом потоке не будет проще т.к. нужно будет синхронизировать, а также работа с БД разрешена только в потоке, создавшем подключение (http://doc.trolltech.com/3.3/threads.html)

полагаю сигналы и слоты не помогут т.к.основной GUI поток занят - некому отрисовывать

думаю рисовать "руками" средствами X, а отрисовку через qt запретить, но нет опыта таких программ

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

Глупо конечно, но всеже, а нельзя после нажатия кнопки сначало отрисовать окно\виджет с надписью, потом выполнять трудные действия, а потом грохнуть окно\виджет?
Если я не прав, подскажите в чем?

DDR ★★
()
Ответ на: комментарий от DDR

>Если я не прав, подскажите в чем?

в том что "виндовенько" это будет. ненавижу 2 вещи - подвисающие окна, и окна которые не умеют адекватно менять свои размеры.

ТС: ну так создай новое подключение к БД, в том потоке в котором выполняешь работу... Перекидывать GUI по потокам - это очень дурной тон программирования.

k0l0b0k ★★
()
Ответ на: комментарий от k0l0b0k

пока не хочу работать из другого потока - это меняет логику работы (буду думать)
но и "перекидывать" не хотел - думал отрисовывать только это всплавыющее окно своими силами, в работу qt лезть и не хотел

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

> в другом потоке не будет проще т.к. нужно будет синхронизировать

Что надо будет синхронизировать? Сигналы/слоты вполне себе между потоками работают без дополнительных усилий.

Begemoth ★★★★★
()
Ответ на: комментарий от x905

> полагаю сигналы и слоты не помогут т.к.основной GUI поток занят - некому отрисовывать

GUI и система сигналов/слотов никак не связаны - пока работает один поток, в других будут независимо работать отдельные циклы обработки событий.

Т.е. нужно сделать отдельный поток для тяжёлой операции унаследовавшись от QThread, определить ему сигналы для оповещения GUI-потока о состоянии операции и связать их со слотами, обновляющими диалог статуса операции. man QObject::connect на предмет пятого параметра connectionType.

> думаю рисовать "руками" средствами X, а отрисовку через qt запретить, но нет опыта таких программ

Это неправильный путь.

Begemoth ★★★★★
()

QApplication::processEvents не даст подвиснуть "морде"

kitov ★★★
()

я такие вещи делаю в отдельном потоке. многопоточность доставляет проблем, но зато интерфейс работает как нужно.

VladimirMalyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.