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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QThread  (Прочитано 9661 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Декабрь 10, 2014, 16:21 »

Создается поток по нажатию и запускается по нажатию кнопки
но почему-то при закрытии виджета поток все еще остается, хотя в
деструкторе я его убиваю.
Подскажите в чем причина  Непонимающий

Код
C++ (Qt)
void Widget::createThread()
{
...
thread = new Thread();
thread->start();
 
}
 
void Widget::~Widget()
{
 if(thread->isRunning()){
    thread->quit();
    thread->wait();
    thread->deleteLater();
}
}
 
 
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Декабрь 10, 2014, 16:34 »

Может потому, что deleteLater() не сразу удаляет обьект.
А как Вы определяете, что он все еще остается?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Декабрь 10, 2014, 16:37 »

deleteLater() удалит поток когда:

1. Он перестанет работать.
2. На него никто не будет ссылаться.

Возникает вопрос, что внутри потока ?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #3 : Декабрь 10, 2014, 16:38 »

по выводу сообщения в консоль из потока через дебаг
Код
C++ (Qt)
void Thread::run()
{
 forever(){
   qDebug()<<"Thread";
   funcWait(20); //20 msec
}
}
 

« Последнее редактирование: Декабрь 10, 2014, 16:50 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Декабрь 10, 2014, 17:15 »

Ступил, понял
надо делать так:

Код
C++ (Qt)
void Widget::createThread()
{
...
thread = new Thread();
thread->threadStart = true;
thread->start();
 
}
 
void Widget::~Widget()
{
 if(thread != NULL){
    thread->startThread = false
    thread->quit();
    thread->wait();
    thread->deleteLater();
 
void Thread::run(){
 
 forever(){
 if(!threadStart){
   break;
 }
...
}
 
Записан
Alexu007
Гость
« Ответ #5 : Декабрь 10, 2014, 19:01 »

А почему deleteLater()? Обычный delete() чем плох?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 11, 2014, 12:40 »

deleteLater() удалит поток когда:

1. Он перестанет работать.
2. На него никто не будет ссылаться.
Не знаю как можно сослаться на поток, прошу привести пример. И по-моему если поток и работает - все равно удалится (некорректно, ошибка в консоли).

deleteLater засылает событие на удаление в текущий EventLoop, удаление будет выполнено когда дело дойдет до этого события. Это иногда удобно, но операция опасная, не надо использовать ее без необходимости.
Записан
Bepec
Гость
« Ответ #7 : Декабрь 11, 2014, 16:29 »

Операция с тем же риском, что и new и delete. Если не изгаляться и думать при написании об архитектуре, то всё будет нормально.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 12, 2014, 10:22 »

Операция с тем же риском, что и new и delete. Если не изгаляться и думать при написании об архитектуре, то всё будет нормально.
Тогда поясните что должно происходить в примере выше
Код
C++ (Qt)
if(thread != NULL){
    thread->startThread = false
    thread->quit();
    thread->wait();
    thread->deleteLater();
- в какой (или чей) EventLoop будет помещено событие удаления?
- когда оно будет извлечено и произойдет удаление thread?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Декабрь 12, 2014, 13:30 »

- в какой (или чей) EventLoop будет помещено событие удаления?
- когда оно будет извлечено и произойдет удаление thread?
А вы готовы утверждать в чей eventloop попадет событие по тем отрывкам кода, который есть в теме?
Очень интересно. Улыбающийся
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #10 : Декабрь 12, 2014, 14:49 »

так как правильно Непонимающий
Код:
delete...
или
Код:
...->deleteLater();
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Декабрь 12, 2014, 14:52 »

так как правильно Непонимающий
В вашем случае достаточно простого delete.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 12, 2014, 15:26 »

А вы готовы утверждать в чей eventloop попадет событие по тем отрывкам кода, который есть в теме?
А чего мне утверждать - я лучше спрошу у того кто делает такие авторитетные заявления
Операция с тем же риском, что и new и delete. Если не изгаляться и думать при написании об архитектуре, то всё будет нормально.
Пусть он разъясняет/утверждает  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Декабрь 12, 2014, 15:38 »

Вы задаете вопросы, для ответов на которые не хватает информации и просите разяснить или утвердить? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 12, 2014, 17:03 »

Вы задаете вопросы, для ответов на ..
Ну что Вы, право, как орел защищающий птенца-Вереса Улыбающийся Нечего его защищать, как всегда ляпнул не подумавши - пусть отвечает. А для Вас я запостил тему про темплейты, лучше там ответьте
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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