Russian Qt Forum
Ноябрь 23, 2024, 11:53
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
QThread
Страниц:
1
[
2
]
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QThread (Прочитано 23611 раз)
iroln
Гость
Re: QThread
«
Ответ #15 :
Май 22, 2012, 21:18 »
demaker
Поток можно запускать/завершать какое угодно количество раз, при этом объект потока пересоздавать не надо.
Записан
Alex_C
Гость
Re: QThread
«
Ответ #16 :
Май 22, 2012, 21:43 »
Цитата: iroln от Май 22, 2012, 21:18
demaker
Поток можно запускать/завершать какое угодно количество раз, при этом объект потока пересоздавать не надо.
Очень интересный вопрос на самом деле. Дело в том, что в винде, завершившись поток уничтожает себя. Что Вы имеете под понятием "не пересоздавать заново"? Может в Линуксе как то не так?)))
На самом деле так: поток существует до тех пор, пока он работает. После прекращения работы - он уничтожается.
Теперь конкретно к Вамему вопросу - поток у Вас должен быть один?
Записан
Alex_C
Гость
Re: QThread
«
Ответ #17 :
Май 22, 2012, 21:48 »
Цитата: iroln от Май 22, 2012, 20:18
Например у меня есть поток без цикла обработки событий, в нём запускается блокирующая длительная процедура, которая является "чёрным ящиком". В какой-то момент я хочу поток грохнуть, не дожидаясь, пока та процедура отработает. Наверное надо вызвать terminate? Но это вообще не рекомендуется, тогда вопрос, как быть?
Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Записан
mutineer
Гость
Re: QThread
«
Ответ #18 :
Май 22, 2012, 21:54 »
Цитата: Alex_C от Май 22, 2012, 21:43
Очень интересный вопрос на самом деле. Дело в том, что в винде, завершившись поток уничтожает себя. Что Вы имеете под понятием "не пересоздавать заново"? Может в Линуксе как то не так?)))
В разговоре, скорее всего, имеется в виду экземпляр класса QThread, который создавался для управления потоком, а не сущность ядра
Записан
iroln
Гость
Re: QThread
«
Ответ #19 :
Май 22, 2012, 21:57 »
Цитата: Alex_C от Май 22, 2012, 21:48
Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Хорошо, соглашусь. Как правильно?
По поводу "Что Вы имеете под понятием "не пересоздавать заново"?" - имею ввиду экземпляр класса QThread, тут уже ответили за меня. Я неправильно выразился на счёт "объекта потока".
Записан
Alex_C
Гость
Re: QThread
«
Ответ #20 :
Май 22, 2012, 22:02 »
Цитата: mutineer от Май 22, 2012, 21:54
В разговоре, скорее всего, имеется в виду экземпляр класса QThread, который создавался для управления потоком, а не сущность ядра
+100500)) Очень хорошее замечание! По этому, как мне кажется (я буду очень рад, если кто скажет, что не так) - уничтожение потока нужно производить, как я написал.
Отдельно по Вашему сообщению - очень интересно... Ну не уничтожаем мы экземпляр класса QThread... Честно говоря пока этот вопрос не прорабатывал. И? Где он висит?
Записан
mutineer
Гость
Re: QThread
«
Ответ #21 :
Май 22, 2012, 22:05 »
Цитата: Alex_C от Май 22, 2012, 22:02
Отдельно по Вашему сообщению - очень интересно... Ну не уничтожаем мы экземпляр класса QThread... Честно говоря пока этот вопрос не прорабатывал. И? Где он висит?
Где создан, там и висит (в стеке или в хипе). Это ж обычный класс, по сути. Так что удалять его объекты надо как и все другие кутишные объекты.
Но можно вызвать у него же start(), не создавая новый объект, если нужно запустить новый поток (после остановки старого, конечно же)
«
Последнее редактирование: Май 22, 2012, 22:07 от mutineer
»
Записан
Alex_C
Гость
Re: QThread
«
Ответ #22 :
Май 22, 2012, 22:13 »
Цитата: mutineer от Май 22, 2012, 22:05
Где создан, там и висит (в стеке или в хипе).
Да это понятно. Другое дело - практическое применение - пока не понятно. Если в стеке -уничтожится. Тут вопросов нет. Хорошо. Создали в "куче". Просто вопрос для меня не праздный. В отличии от Дельфи можно просто start() сказать?
... пока писал - ответ получил - спасибо! не знал, что вот так можно снова start() вызвать! Спасибо!
Записан
mutineer
Гость
Re: QThread
«
Ответ #23 :
Май 22, 2012, 22:17 »
Цитата: Alex_C от Май 22, 2012, 22:13
Да это понятно. Другое дело - практическое применение - пока не понятно.
Отнаследовались, переопределили метод run(), написали туда своего кода. Выполнили раз. После завершения надо выполнить тот же код еще раз. Чтобы не удалять старый объект и не создавать новый можно просто запустить еще раз старый.
Цитата: Alex_C от Май 22, 2012, 22:13
Если в стеке -уничтожится. Тут вопросов нет. Хорошо. Создали в "куче". Просто вопрос для меня не праздный. В отличии от Дельфи можно просто start() сказать?
не понял вопроса
Записан
Alex_C
Гость
Re: QThread
«
Ответ #24 :
Май 22, 2012, 22:31 »
Спасибо! Очень интересная информация. В пояснении моего вопроса - в Дельфи если есть класс определенный пользователем - то тут уж все))) Никакого наследования - все не привыкну к правильному Qt))
Записан
iroln
Гость
Re: QThread
«
Ответ #25 :
Май 22, 2012, 22:37 »
Цитата: Alex_C от Май 22, 2012, 22:13
... пока писал - ответ получил - спасибо! не знал, что вот так можно снова start() вызвать! Спасибо!
Ну так и я о том же говорил.
Возвращаясь:
Цитировать
Например у меня есть поток без цикла обработки событий, в нём запускается блокирующая длительная процедура, которая является "чёрным ящиком". В какой-то момент я хочу поток грохнуть, не дожидаясь, пока та процедура отработает. Наверное надо вызвать terminate? Но это вообще не рекомендуется, тогда вопрос, как быть?
Цитировать
Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Так как сделать в данном случае правильную логику? Я не прикалываюсь, мне правда интересно, как лучше сделать. Пока я просто дожидаюсь выполнения процедуры.
Записан
Alex_C
Гость
Re: QThread
«
Ответ #26 :
Май 22, 2012, 22:45 »
Цитата: iroln от Май 22, 2012, 22:37
Так как сделать в данном случае правильную логику? Я не прикалываюсь, мне правда интересно, как лучше сделать. Пока я просто дожидаюсь выполнения процедуры.
На мой взгляд только так - если Вы не вкладываете в код отдельного треда завершения по "указанию" - правильно только одно - ждать пока он завершиться. Хотите иначе - вложите в код некий цикл, аля тот что вкладывает в него метод exec() (хотя это по определению не верно... хотя могут быть основания). Давайте определимся - что значит "долгая" операция? Ее ведь как то можно .... разбить на проверки окончания? Или нет?
Записан
mutineer
Гость
Re: QThread
«
Ответ #27 :
Май 22, 2012, 22:48 »
Цитата: Alex_C от Май 22, 2012, 22:45
На мой взгляд только так - если Вы не вкладываете в код отдельного треда завершения по "указанию" - правильно только одно - ждать пока он завершиться. Хотите иначе - вложите в код некий цикл, аля тот что вкладывает в него метод exec() (хотя это по определению не верно... хотя могут быть основания). Давайте определимся - что значит "долгая" операция? Ее ведь как то можно .... разбить на проверки окончания? Или нет?
Как можно разбить чужой скомпилированный метод на проверки окончания? Или как в него вставить этот самый "некий цикл"?
Записан
demaker
Птица говорун
Offline
Сообщений: 962
Re: QThread
«
Ответ #28 :
Май 22, 2012, 22:51 »
Цитата: Alex_C от Май 22, 2012, 21:43
Цитата: iroln от Май 22, 2012, 21:18
demaker
Поток можно запускать/завершать какое угодно количество раз, при этом объект потока пересоздавать не надо.
Да по логике понятно что это так.
т.е. програмно это выглядит примерно так?
void threadForm:: keyPressEvent ( QKeyEvent * event)
{
...
if(event->key == Qt::Key_1)
{
thread->quit();
thread->wait();
event->accept();
}
}
void threadForm::mouseDoubleClickEvent ( QMouseEvent * event )
{
...
thread->start;
event->accept;
}
или нет...
Записан
Alex_C
Гость
Re: QThread
«
Ответ #29 :
Май 22, 2012, 22:51 »
Цитата: mutineer от Май 22, 2012, 22:48
Как можно разбить чужой скомпилированный метод на проверки окончания? Или как в него вставить этот самый "некий цикл"?
1. Чужой - никак. Речь шла о своем коде. Извините - я что то пропустил?
2. Ответ: никак.
Записан
Страниц:
1
[
2
]
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...