1 | ||||||||||||||||
Завершить работу слота (закрыть диалог) потока, если извне для него была вызвана exit()15.08.2014, 18:37. Показов 1975. Ответов 9
Метки нет (Все метки)
Привет!
С Qt работал мало и очень давно, поэтому задаю такие вопросы. Смотрите - в самом приложении есть слоты, в которых запускаются потоки (в идеале хочу сделать так - в одном слоте поток запускается, в другом убивается). Первая проблема, с которой я столкнулся - это гуй (оказалось, что я не могу из созданного потока рисовать гуй), поэтому придумал такой обходной путь:
Так вот, когда в main thread дергается слот, где я хочу завершить работу созданного потока у меня там такой код
Скажите что я делаю не так и как мне сделать все грамотно?
0
|
15.08.2014, 18:37 | |
Ответы с готовыми решениями:
9
Форма не прорисовывается до конца, если была вызвана из другого потока Завершить работу потока при закрытии формы Добавить ф-цию в прототип, которая модифицирует объект, для которого она была вызвана Проверить дату создания файла и если не совпадает - завершить работу |
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
15.08.2014, 20:45 | 2 |
Все просто. Все что связано с GUI в потоке делать нельзя. Вообще вызвать все QtGui/QtWidgets классы в потоке нельзя.
В дочерних потоках обработка. В основном интерфейс.
0
|
15.08.2014, 20:59 [ТС] | 3 |
RazrFalcon, это я знаю. Но мне нужно очень часто показывать всякие MessageBox'ы, диалоги и пр.
Элементарно - показать диалог "файл не существует. Создать? да/нет". Как тогда можно это организовать?
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
15.08.2014, 21:27 | 4 |
Посылать из потока сигнал с QString содержащий текст сообщения, а в слоте в главном потоке отображать уже само сообщение.
0
|
15.08.2014, 22:36 [ТС] | 5 | |||||
Я сначала так и делал, но встал вопрос - как дождаться ответа от главного потока (не костыльно). Сделал опять же через сигналы/слоты, но потом их столько наплодилось, что самому стало сложно читать. Поэтому все удалил и переделал.
делал так
Поэтому плюнул и переписал так, как есть. Добавлено через 19 минут В очередной раз попробовал погуглить по поводу показа гуя в главном потоке через сигналы/слоты. Вроде говорят Qt::BlockingQueuedConnection решает мою проблему (100500 сигналов и слотов). Завтра попробую, отпишусь.
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
15.08.2014, 22:54 | 6 |
Так если нужно постоянно тормозить поток - может он и не нужен?
Не понял зачем вам 100500 сигналов слотов? В сигнале передаем какой нам нужен тип диалога, ну а ответ такой же как сейчас. Итого два connect'a и все.
1
|
1 / 1 / 2
Регистрация: 15.08.2014
Сообщений: 5
|
||||||
16.08.2014, 00:01 | 7 | |||||
Вот зауважаю и Kastaneda, если верно, что
0
|
16.08.2014, 09:44 [ТС] | 8 |
Нет, нужен. В общих чертах суть программы - программа всегда висит в фоне, реагирует на любой новый вставленный накопитель (флешка и т.д.), для каждого нового накопителя запускается свой поток, который (если опустить подробности) копирует файлы с накопителя на диск. Может быть ситуация, когда вставят сразу 10 флешек, поэтому потоки нужны.
0
|
16.08.2014, 12:19 | 9 |
Вспомогательный поток с эвент лупом :
1. Когда надо шлет сообщение основному что нужно вызвать диалог, после чего поток упирается в эвент луп и ждет сигнала что бы продолжить работу. 2. После того как диалог будет закрыт основной поток высылается сигнал вспомогательному потоку что он может продолжить свою работу.
0
|
18.08.2014, 21:21 [ТС] | 10 |
Вобщем я все переписал. Во первых потоки организовал вот так, во вторых гуй показываю в слоте в main thread через сигналы, а коннекчусь через Qt::BlockingQueuedConnection, который действительно работает
1
|
18.08.2014, 21:21 | |
18.08.2014, 21:21 | |
Помогаю со студенческими работами здесь
10
Выполнение слота основного потока через сигнал второстепенного потока Узнать кем была вызвана активность Определение, откуда была вызвана функция Как получить строку из которой была вызвана функция? Узнать адрес ячейки из которой была вызвана функция Нужен компьютер: 4 ядра,DD3 память,два слота для видеокарты и 4 слота для ОЗУ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |