QThread: изменение элементов QDialog, Красивое решение. |
Здравствуйте, гость ( Вход | Регистрация )
QThread: изменение элементов QDialog, Красивое решение. |
canavar |
29.3.2009, 17:40
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 26.3.2009 Пользователь №: 643 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем доброго вечера.
Есть такая проблема: Существует окно QDialog. При загрузке этого окна происходят довольно тяжелые вычисления и, как следствие, окно замораживается. Элементов на форме 6 штук ( два QTableWidget, четыре QListWidget). Хотелось бы вынести все вычисления в отдельный поток. Но я не понимаю, как сделать так, чтобы второй поток смог изменять Widget'ы на форме QDialog. Можно конечно в поток передавать указатели на Widget'ы, но у меня есть подозрение, что существует более красивое решение... Что вы можете сказать по этому поводу? Заранее спасибо. |
|
|
ViGOur |
29.3.2009, 17:46
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Но я не понимаю, как сделать так, чтобы второй поток смог изменять Widget'ы на форме QDialog. Можно конечно в поток передавать указатели на Widget'ы, но у меня есть подозрение, что существует более красивое решение... Что подразумевается под "красивое решение"? Без указателей ну никак не обойтись, но на все виджеты не обязательно передавать достаточно передать указатель на тот объект, в классе которого они "живут". |
|
|
Litkevich Yuriy |
29.3.2009, 17:48
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А ещё лучше использовать сигналы и слоты.
|
|
|
canavar |
29.3.2009, 17:53
Сообщение
#4
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 26.3.2009 Пользователь №: 643 Спасибо сказали: 0 раз(а) Репутация: 0 |
Под красивым решением имеется ввиду... кхм... не описать, нужно прочувствовать.
Да, согласен, так скорее всего и сделаю -- передам указатель на главный объект. ) Тогда вопросик в догонку... Тут начал переносить вычисления в отдельный поток.. Переопределил customEvent(), чтобы поток ловил event'ы. Переопределил run(). запихнул туда все вычисления. В конце метода run() написал exec(), чтобы thread не завершался и ждал event'ы. Но после того, как вычисления завершаются, программа вылетает с exception... Не могу понять в чем проблема. Если exec убрать, то все нормально, но поток завершается и не ловит event'ы. Нет никаких мыслей по этому поводу? P.S. Скоро код выложу, чтобы понятнее было.. |
|
|
Litkevich Yuriy |
29.3.2009, 17:57
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
canavar |
29.3.2009, 18:00
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 26.3.2009 Пользователь №: 643 Спасибо сказали: 0 раз(а) Репутация: 0 |
Что-то типа:
Если так, то если не сложно, можете объяснить почему вылетает exception, если использовать exec(); |
|
|
igor_bogomolov |
29.3.2009, 18:11
Сообщение
#7
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Но я не понимаю, как сделать так, чтобы второй поток смог изменять Widget'ы на форме QDialog. Можно конечно в поток передавать указатели на Widget'ы Без указателей ну никак не обойтись Но мы же не можем работать с виджетыми в дочернем потоке. Все работа с ними производится только в осносном Gui потоке. |
|
|
ViGOur |
29.3.2009, 19:46
Сообщение
#8
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Но мы же не можем работать с виджетыми в дочернем потоке. Все работа с ними производится только в осносном Gui потоке. Все правильно, но для того, чтобы послать сигнал какому-либо виджету нужен как минимум указатель на объект класса, который может их контролировать.В посте выше я забыл сказать насчет сигналов и слотов, но Litkevich Yuriy меня дополнил. |
|
|
igor_bogomolov |
29.3.2009, 20:03
Сообщение
#9
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
ИМХО.
Я так понимаю, что это от реализации программы зависит. Чтобы имитировать сигнал никаких указателей не нужно. Вот уже где распологается коннект, это другое дело. Все равно экземпляры класса, наследовонного от QThread, будут создаваться в "Gui_class", так и коннекты между ними лучше делять тамже. connect(&thread, SIGNAL(thread_signal()), this, SLOT(gui_slot())); Сообщение отредактировал igor_bogomolov - 29.3.2009, 20:05 |
|
|
canavar |
29.3.2009, 20:07
Сообщение
#10
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 26.3.2009 Пользователь №: 643 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо за ответы.
Так можно узнать почему, если я использую exec() у меня вылезает exception, а если бесконечный цикл, то все нормально? |
|
|
Текстовая версия | Сейчас: 22.12.2024, 6:24 |