![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
gpepsi |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
как из потоковой функции можно понять, что ожидается завершение потока ?
|
|
|
ViGOur |
![]()
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Послать ей сигнал.
Или ввести какую-нибудь переменную, например bool m_bThreadStop = false;, которую периодически проверять. |
|
|
gpepsi |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Или ввести какую-нибудь переменную, например bool m_bThreadStop = false;, которую периодически проверять. у меня куча потоков. для каждой заводить переменную ? Послать ей сигнал. а как внутри определить ? ну если внутри while(true) { } никак не завершиться. нужно ожидать на чем-то. Странно что этого не предусмотрели... Сообщение отредактировал gpepsi - 5.10.2011, 12:35 |
|
|
silver47 |
![]()
Сообщение
#4
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
gpepsi |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
gpepsi |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Чем не подходит QThread::quit() ? а - понял, что имеется ввиду
в главном потоке
1. Это если все на сигналах построено, а если мне нужно крутить цикл, например, для чтения
2. Что если слоты подключаются в главном потоке, а сигналы вызываются в дочернем ? |
|
|
silver47 |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: ![]() ![]() ![]() |
Имеется ввиду, что если у вас есть указатели на потоки, то можно вызвать метод QThread::quit(). А проверить есть ли запущенные потоки, кроме основного и подождать их завершения можно так:
Крутить цикл для чтения из чего? Из файла или Вы серверную\клиентскую сторону сетевого приложения пишете? Во втором случае, удобнее, как мне кажется, использовать сигнал readyRead(). |
|
|
ViGOur |
![]()
Сообщение
#8
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
у меня куча потоков. для каждой заводить переменную ? Зачем для каждого? Достаточно разок завести для базового, что-то вроде этого:
|
|
|
gpepsi |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#10
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Или выносить в другой поток или не использовать цикл, а пользоваться только сигналами...
|
|
|
gpepsi |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#12
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
А ты попробуй.
Механизм сигналов и слотов асинхронный, если ты не будешь тупо всисеть в sleep в потоке, который должен получить сигнал, то значит всё долно работать. И еще, как ты думаешь в твоём коде: дойдет выполнение до th.quit(); ?Мне кажется, что дальше app.exec(); не пройдет. ![]() |
|
|
gpepsi |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А ты попробуй. а что тут пробовать
код
без цикла обработки quit не прокатывает Сообщение отредактировал gpepsi - 6.10.2011, 17:08 |
|
|
ViGOur |
![]()
Сообщение
#14
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Посмотри на: QCoreApplication::processEvents, он как раз делает то, что тебе нужно...
|
|
|
silver47 |
![]()
Сообщение
#15
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: ![]() ![]() ![]() |
Цитата
Зачем это? Что Вы делаете в цикле то? |
|
|
gpepsi |
![]()
Сообщение
#16
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
silver47 |
![]()
Сообщение
#17
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 1.4.2010 Пользователь №: 1584 Спасибо сказали: 40 раз(а) Репутация: ![]() ![]() ![]() |
Так всетаки зачем бесконечный цикл то? Мое мнение такое - если бесконечный цикл - то наследоваться от QThread нафиг не нужно - делаем обычный QtConcurrent
|
|
|
ViGOur |
![]()
Сообщение
#18
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
processEvents не сбрасывает ничего, а просто дает отработать сигналам для данного потока.
А если цикл не просто бесконечный, с условием, тогда всё в порядке. |
|
|
gpepsi |
![]()
Сообщение
#19
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А если цикл не просто бесконечный, с условием, тогда всё в порядке. то есть самому контролировать выход ? processEvents не сбрасывает ничего, а просто дает отработать сигналам для данного потока. руками вместо exec ? Так всетаки зачем бесконечный цикл то? Мое мнение такое - если бесконечный цикл - то наследоваться от QThread нафиг не нужно - делаем обычный QtConcurrent а чем он лучше и как решит это мою проблему ? P.S. и кстати как быть с сигналами. Если объект создан в главном потоке, то и сигналы в главном потоке будут обрабатываться, а если объект создан в run ? |
|
|
ViGOur |
![]()
Сообщение
#20
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Цитата то есть самому контролировать выход ? Да, именно так. у тебя же цикл не с вечным sleep'ом, вот и вызывай на каждой его итерации processEvents. А он в свою очередь будет обрабатывать сигналы и вызывать что нужно...Цитата руками вместо exec ? Да. Выше уже описал...Цитата P.S. и кстати как быть с сигналами. Если объект создан в главном потоке, то и сигналы в главном потоке будут обрабатываться, а если объект создан в run ? Запомни, в каком потоке создан объек, в том он и обрабатывается. Если тебя это не устраивает, то после создания объекта ты его можешь передать в другой поток с помощью: void QObject::moveToThread ( QThread * targetThread )
|
|
|
gpepsi |
![]()
Сообщение
#21
|
Студент ![]() Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ViGOur, а если я создаю поток только для вычитывания и разбора данных. Далее я хочу разобранные данные отдать в GUI для отрисовки.
Получается, что в run я должен это все делать, а отдавать данные через сигнал. Если объект создан в главном потоке, то и сигнал будет обработан в главном потоке, что позволит отрисовать их в GUI. Причем processEvents будет не нужен, т.к. QCoreApplication::exec обрабатывает свой цикл событий. Причем в данно случае я могу объекту потоку послать сигнал, который будет обработан в главном потоке. Я правильно размышляю ? Единственное остался вопрос - зачем тогда вообще создавать объекты в run как в примере
если для GUI их все-равно придется отдавать в главный поток, что за нас делает сигнал Кстати, если я не использую потоки, а только сигналы, например, вычитывая данные из сокета вся обработка будет в главном потоке, то приведет к подвисанию GUI если данных очень много P.S. А чем тогда QtConcurrent полезен ? Сообщение отредактировал gpepsi - 7.10.2011, 9:02 |
|
|
ViGOur |
![]()
Сообщение
#22
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Чтобы было меньше вопросов, предлагаю тебе почитать вот что:
1. Поддержка потоков в Qt 2. Сигналы и слоты Там не так много букв как кажется, и как показывает практика как хотелось бы, и это базовые знания, которые нужно знать каждому, кто работает с Qt и использует потоки. Ну а без сигналов тут разумеется никуда. И если после прочтения у тебя возникнут вопросы, то задавай их, но я думаю они сами по себе отпадут. ![]() QtConcurrent, там тоде описан... |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 14.7.2025, 9:02 |