Russian Qt Forum
Сентябрь 24, 2024, 20:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: QThread  (Прочитано 23373 раз)
iroln
Гость
« Ответ #15 : Май 22, 2012, 21:18 »

demaker
Поток можно запускать/завершать какое угодно количество раз, при этом объект потока пересоздавать не надо.
Записан
Alex_C
Гость
« Ответ #16 : Май 22, 2012, 21:43 »

demaker
Поток можно запускать/завершать какое угодно количество раз, при этом объект потока пересоздавать не надо.

Очень интересный вопрос на самом деле. Дело в том, что в винде, завершившись поток уничтожает себя. Что Вы имеете под понятием "не пересоздавать заново"? Может в Линуксе как то не так?)))

На самом деле так: поток существует до тех пор, пока он работает. После прекращения работы - он уничтожается.
Теперь конкретно к Вамему вопросу - поток у Вас должен быть один?
Записан
Alex_C
Гость
« Ответ #17 : Май 22, 2012, 21:48 »

Например у меня есть поток без цикла обработки событий, в нём запускается блокирующая длительная процедура, которая является "чёрным ящиком". В какой-то момент я хочу поток грохнуть, не дожидаясь, пока та процедура отработает. Наверное надо вызвать terminate? Но это вообще не рекомендуется, тогда вопрос, как быть?

Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Записан
mutineer
Гость
« Ответ #18 : Май 22, 2012, 21:54 »

Очень интересный вопрос на самом деле. Дело в том, что в винде, завершившись поток уничтожает себя. Что Вы имеете под понятием "не пересоздавать заново"? Может в Линуксе как то не так?)))

В разговоре, скорее всего, имеется в виду экземпляр класса QThread, который создавался для управления потоком, а не сущность ядра
Записан
iroln
Гость
« Ответ #19 : Май 22, 2012, 21:57 »

Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Хорошо, соглашусь. Как правильно? Улыбающийся

По поводу "Что Вы имеете под понятием "не пересоздавать заново"?" - имею ввиду экземпляр класса QThread, тут уже ответили за меня. Я неправильно выразился на счёт "объекта потока". Улыбающийся
Записан
Alex_C
Гость
« Ответ #20 : Май 22, 2012, 22:02 »

В разговоре, скорее всего, имеется в виду экземпляр класса QThread, который создавался для управления потоком, а не сущность ядра

+100500)) Очень хорошее замечание! По этому, как мне кажется (я буду очень рад, если кто скажет, что не так) - уничтожение потока нужно производить, как я написал.

Отдельно по Вашему сообщению - очень интересно... Ну не уничтожаем мы экземпляр класса QThread... Честно говоря пока этот вопрос не прорабатывал. И? Где он висит?
Записан
mutineer
Гость
« Ответ #21 : Май 22, 2012, 22:05 »

Отдельно по Вашему сообщению - очень интересно... Ну не уничтожаем мы экземпляр класса QThread... Честно говоря пока этот вопрос не прорабатывал. И? Где он висит?

Где создан, там и висит (в стеке или в хипе). Это ж обычный класс, по сути. Так что удалять его объекты надо как и все другие кутишные объекты.

Но можно вызвать у него же start(), не создавая новый объект, если нужно запустить новый поток (после остановки старого, конечно же)
« Последнее редактирование: Май 22, 2012, 22:07 от mutineer » Записан
Alex_C
Гость
« Ответ #22 : Май 22, 2012, 22:13 »

Где создан, там и висит (в стеке или в хипе).

Да это понятно. Другое дело - практическое применение - пока не понятно. Если в стеке -уничтожится. Тут вопросов нет. Хорошо. Создали в "куче". Просто вопрос для меня не праздный. В отличии от Дельфи можно просто start() сказать?

... пока писал - ответ получил - спасибо! не знал, что вот так можно снова start() вызвать! Спасибо!
Записан
mutineer
Гость
« Ответ #23 : Май 22, 2012, 22:17 »

Да это понятно. Другое дело - практическое применение - пока не понятно.

Отнаследовались, переопределили метод run(), написали туда своего кода. Выполнили раз. После завершения надо выполнить тот же код еще раз. Чтобы не удалять старый объект и не создавать новый можно просто запустить еще раз старый.

Если в стеке -уничтожится. Тут вопросов нет. Хорошо. Создали в "куче". Просто вопрос для меня не праздный. В отличии от Дельфи можно просто start() сказать?

не понял вопроса
Записан
Alex_C
Гость
« Ответ #24 : Май 22, 2012, 22:31 »

Спасибо! Очень интересная информация. В пояснении моего вопроса - в Дельфи если есть класс определенный пользователем - то тут уж все))) Никакого наследования  - все не привыкну к правильному Qt))
Записан
iroln
Гость
« Ответ #25 : Май 22, 2012, 22:37 »

... пока писал - ответ получил - спасибо! не знал, что вот так можно снова start() вызвать! Спасибо!
Ну так и я о том же говорил.

Возвращаясь:
Цитировать
Например у меня есть поток без цикла обработки событий, в нём запускается блокирующая длительная процедура, которая является "чёрным ящиком". В какой-то момент я хочу поток грохнуть, не дожидаясь, пока та процедура отработает. Наверное надо вызвать terminate? Но это вообще не рекомендуется, тогда вопрос, как быть?
Цитировать
Вы сами ответили на своей вопрос - логика Вашей программы - однозначно не правильна.
Так как сделать в данном случае правильную логику? Я не прикалываюсь, мне правда интересно, как лучше сделать. Пока я просто дожидаюсь выполнения процедуры.

Записан
Alex_C
Гость
« Ответ #26 : Май 22, 2012, 22:45 »

Так как сделать в данном случае правильную логику? Я не прикалываюсь, мне правда интересно, как лучше сделать. Пока я просто дожидаюсь выполнения процедуры.

На мой взгляд только так - если Вы не вкладываете в код отдельного треда завершения по "указанию" - правильно только одно - ждать пока он завершиться. Хотите иначе - вложите в код некий цикл, аля тот что вкладывает в него метод exec() (хотя это по определению не верно... хотя могут быть основания). Давайте определимся - что значит "долгая" операция? Ее ведь как то можно .... разбить на проверки окончания? Или нет?
Записан
mutineer
Гость
« Ответ #27 : Май 22, 2012, 22:48 »

На мой взгляд только так - если Вы не вкладываете в код отдельного треда завершения по "указанию" - правильно только одно - ждать пока он завершиться. Хотите иначе - вложите в код некий цикл, аля тот что вкладывает в него метод exec() (хотя это по определению не верно... хотя могут быть основания). Давайте определимся - что значит "долгая" операция? Ее ведь как то можно .... разбить на проверки окончания? Или нет?

Как можно разбить чужой скомпилированный метод на проверки окончания? Или как в него вставить этот самый "некий цикл"?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #28 : Май 22, 2012, 22:51 »

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
Гость
« Ответ #29 : Май 22, 2012, 22:51 »

Как можно разбить чужой скомпилированный метод на проверки окончания? Или как в него вставить этот самый "некий цикл"?

1. Чужой - никак. Речь шла о своем коде. Извините - я что то пропустил?
2. Ответ: никак.
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.