Поиск:

Ответ в темуСоздание новой темы Создание опроса
> автоудаление объекта QThread, возможно ли? 
V
    Опции темы
sergey_85
Дата 20.10.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

есть код, он должен выполняться сколько угодно раз по нажатию кнопки, можно ли заставить объекты QThread самоудаляться после выполнения потока? 
Код

void on_button_click()
{
   MyThread *th = new MyThread(); // наследован от QThread
   th->start();
} 
 //утечка памяти, переменная потеряна 



Я пробровал использовать QRunnable, но он не дает возможность запуска нескольких потоков одновременно, т.е после первого раза все ок, а на 2 раз новый поток не создается!
Код

void on_button_click()
{
       MyRunner *run = new MyRunner(); //наследован о тQRunnable
       bool isRun  = QThreadPool::globalInstance()->tryStart(run);
} 
//память не теряется, объект  автоматически удалиться после выполнения потока


Это сообщение отредактировал(а) sergey_85 - 20.10.2009, 18:58


--------------------
A good design always pays off.
PM MAIL   Вверх
niXman
Дата 20.10.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: -1
Всего: 0



sergey_85, Смотри сигнал void finished(), повесь на него delete
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
sergey_85
Дата 20.10.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



но слот 
Код
finished() 
 без параметров, что я буду удалять где взять имя переменной?


--------------------
A good design always pays off.
PM MAIL   Вверх
niXman
Дата 20.10.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: -1
Всего: 0



Цитата(sergey_85 @  20.10.2009,  17:16 Найти цитируемый пост)
но слот 

Это не слот, это сигнал.

Создай метод в основном классе, соедини сигнал с этим методом, сделай MyThread *th членом класса, и в слоте, используй delete th

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
sergey_85
Дата 20.10.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



да, точно сигнал.

Нет, так не пойдет, потоки запускаются по клику на кнопке, причем кликать по ней можно сколько угодно раз, т.е. последовательно можно запустить 
много потоков нажав на кнопку несколько раз.
Собирать потоки в list и проверять их на finished(), например в таймере неохота...

Это сообщение отредактировал(а) sergey_85 - 20.10.2009, 19:28


--------------------
A good design always pays off.
PM MAIL   Вверх
niXman
Дата 20.10.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: -1
Всего: 0



Цитата(sergey_85 @  20.10.2009,  17:25 Найти цитируемый пост)
Собирать потоки в list и проверять их на finished(), например в таймере неохота...

Странная аргументация)

Добавлено @ 19:54
Цитата(sergey_85 @  20.10.2009,  17:25 Найти цитируемый пост)
в таймере неохота...

А в таймере и не нужно. По сигналу удаляй тот что завершился.

Это сообщение отредактировал(а) niXman - 20.10.2009, 19:54
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
sergey_85
Дата 20.10.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



вообще QRunnable дает встроенное автоудаление, НО у него непонятное поведение например я жму на кнопку, выполняется этот код, 

Код

void on_button_click()
{
       MyRunner *run = new MyRunner(); //наследован о тQRunnable
       bool isRun  = QThreadPool::globalInstance()->tryStart(run);
} 
//память не теряется, объект  автоматически удалиться после выполнения потока

тут же жму еще раз - ничего не происходит, надо ждать пока завершиться 1 поток, странно?


--------------------
A good design always pays off.
PM MAIL   Вверх
SABROG
Дата 20.10.2009, 20:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Код

connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));


Это сообщение отредактировал(а) SABROG - 20.10.2009, 20:36


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
sergey_85
Дата 20.10.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



во!!! классная qt'шная фишка! я так и знал, что-то такое должно быть!

делаю так и деструктор потока вызывается после выполнения run() т.е. после завершения потока! 
Всё как мне и надо!

Код

void on_button_click()
{
   MyThread *th = new MyThread(); // наследован от QThread
   th->start();

  QObject::connect(th, SIGNAL(finished()), th, SLOT(deleteLater()));
} 
 //утечки памяти нет, деструктор потока вызовется автоматом после его завершения!


спасибо большое, SABROG  smile !

на сегодня вопросов больше не имею  smile 

Это сообщение отредактировал(а) sergey_85 - 20.10.2009, 20:48


--------------------
A good design always pays off.
PM MAIL   Вверх
SABROG
Дата 20.10.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Помести connect в конструктор MyThread, так оно более универсальней будет.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
sergey_85
Дата 20.10.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



ok


--------------------
A good design always pays off.
PM MAIL   Вверх
SABROG
Дата 20.10.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Ради интереса попробуй сделать через QRunnable. Только вместо tryStart() используй start() и вызови QThreadPool::setMaxThreadCount() побольше, т.к. для двухядерника количество потоков скорее всего будет 2, а для обычного 1.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.