Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
chets
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 16
1

Работа вспомогательного потока без подвисания основного

27.11.2012, 13:43. Просмотров 1541. Ответов 10
Метки нет (Все метки)

Всем привет! Помогите новичку! Попытался найти в сети, на сайте и в литературе - не помогло. Может плохо искал.
Подскажите как дождаться окончания работы вспомогательного потока (QThread) таким образом, чтобы основной поток не подвисал на время ожидания. (QThread->wait(-1) все равно зависает)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 13:43
Ответы с готовыми решениями:

Выполнение слота основного потока через сигнал второстепенного потока
Доброго времени суток! Вопрос следующий. В основном потоке создается кнопка и...

Запуск QProcess без блокировки основного окна
Есть такие слоты void openF(){ QString...

Работа с gui из потока
Можно ли работать с gui приложения непосредственно из потока(многопоточность)?...

избавиться от подвисания
У меня есть программа, она выполняет довольно сложные расчеты и при выполнении...

Затемнение формы без приостановок основного потока
Нужно организовать плавное заметнее всей формы (включая все элементы), причем...

10
Humanoid
Почетный модератор
9962 / 3848 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
27.11.2012, 19:23 2
Цитата Сообщение от chets Посмотреть сообщение
(QThread->wait(-1) все равно зависает)
Конечно... -1 - это бесконечное ожидание. Можно туда очень меленькие значения ставить, тогда можно будет просто проверять, что возвращает функция.
C++ (Qt)
1
2
3
4
if (thread->wait(10))
  // поток завершился
else
  // поток ещё не завершился
И, конечно же, проверять это надо не просто в цикле, иначе всё равно будет подвисать текущий поток, а по таймеру, например.
0
Чистый
Автор FAQ
2713 / 1409 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
27.11.2012, 19:53 3
а лучше через сигналы слоты, так наверно будет правильнее
0
chets
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 16
28.11.2012, 19:00  [ТС] 4
Humanoid, попробовал так, не получилось. Я прям чувствую, что что-то делаю не так!
C++ (Qt)
1
2
3
4
5
6
7
8
9
QTimer* timer = new QTimer(this);
timer->start(100);
while(timer->isActive())
{
  if(thread->wait(10))
       break;
  else
       ui.textEdit->setText("Please wait...");
}
Чистый, а можете привести пример?!

Добавлено через 8 минут
Чистый, а можете привести пример?! Просто я пробовал коннектить, но все равно надо ждать конца работы потока, иначе из него не успеют придти значения, ради которого он и запускается.
0
Humanoid
Почетный модератор
9962 / 3848 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
28.11.2012, 20:04 5
Вообще, у QThread есть сигнал finished(). По идее, он и должен срабатывать, когда поток закончит выполнение. Попробуй подключить его к какому-нибудь слоту. И тогда будут ненужны все эти wait'ы.
1
_SASA_
134 / 138 / 7
Регистрация: 22.08.2011
Сообщений: 484
30.11.2012, 12:56 6
Здравствуйте!
У меня были чуть похожии проблемы... Решал через сигналы и слоты...
Просто при соединеннии классов потоков через сигналы и слоты
нужно объязательно выставлять 5-й параметр == Qt:: DirectConnection,
для немедленного обмена между потоками. Может быть это поможет?!
Удачи!
0
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
02.12.2012, 01:14 7
Может поможет: Циклы в отдельном потоке
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
02.12.2012, 13:39 8
Цитата Сообщение от _SASA_ Посмотреть сообщение
Просто при соединеннии классов потоков через сигналы и слоты
нужно объязательно выставлять 5-й параметр == Qt:: DirectConnection,
для немедленного обмена между потоками
И получить интересные и непредсказуемые результаты при взаимодействии слотов и сигналов
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
03.12.2012, 15:38 9
fasked, да ну, вроде вполне себе предсказуемое поведение, только нужно обезопасить себя мьютексом и все в норме будет, сигналы и слоты на то и придуманы вроде как .
А по теме: посмотрите в сторону QtConcurrent может этими плюшками и обойдетесь и ничего руками делать не придется
0
Night_Light
17 / 17 / 0
Регистрация: 14.02.2009
Сообщений: 86
03.12.2012, 15:58 10
В офф. доках написано юзать Qt::QueuedConnection при передачи сигналов между различными потоками.
Для этого типа подключения сигналы помещаются в цикл сообщений соответствующего потока и обрабатываются в порядке очереди.
Чтобы сигналы посылались, конечно, наде не забыть запустить цикл сообщений внутри своего кастомного QThread.

Работает отлично
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
03.12.2012, 17:04 11
Цитата Сообщение от l_a_m Посмотреть сообщение
только нужно обезопасить себя мьютексом и все в норме будет
Вроде для этого и был придуман QueuedConnecton, чтобы самому мьютексы не городить.
0
03.12.2012, 17:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2012, 17:04

Ожидание нажатия кнопки без блокировки основного потока
Добрый день! Столкнулся с необычной задачей. Есть UserControl, в нем...

Как узнать IP основного и вспомогательного сервера?
Привет, делаю лабораторную по сетям и натолкнулся на такое задание Не...

Как сделать паузу без подвисания и без вызова Sleep?
Здравствуйте, как можно сделать паузу без "второго" потока и вешания программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru