2014-11-03 3 views
4

я сделал что-то вроде этого:Как освободить память объекта Qthread?

//in the mainwindow's constructor 
QThread *thr = new QThread; 
soundWorker * work = new soundWorker; 
connect(this,SIGNAL(playsound()),work,SLOT(process())); 
work->moveToThread(thr); 
thr->start(); 

Должен ли я удалить THR и работать в Разрушитель в главном окне?

ответ

5

Вы можете использовать по умолчанию Qt способ управления памятью с помощью присвоения родителя к QThread, то есть сделать это:

QThread *thr = new QThread(this);//the mainwindow's is now the thread parent 

В Qt, родители несут ответственность за управление памятью своих детей. Таким образом, QThread будет автоматически удаляться по мере необходимости.

Затем для вашего soundWorker у вас есть несколько различных решений. Если его время жизни совпадает с вашим mainwindow, как вы намекаете, когда вы спросите, следует ли его удалить в деструкторе mainwindow, вы можете просто сделать его членом, не являющимся указателем, и его время хранения будет автоматически обрабатываться.

Родительская вещь специфична для Qt. В общем, когда вы имеете дело с памятью, вам следует прибегнуть к оберткам (например, умным указателям), которые позволяют RAII.

Дальнейшее чтение: Qt Trees and ownership model

+1

* Тогда для вашего звукового стола вы можете сделать то же самое, что и QObject. * Нет, он не может. Родитель и ребенок должны жить в одной теме. Если он это сделает, он получит предупреждение ['QObject :: moveToThread: Невозможно переместить объекты с родителем'] (http://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobject.cpp.html # 1462). – thuga

+0

К сожалению, я забыл, что я отредактирую. – JBL

2

Вы можете использовать QThread::finished() сигнал, чтобы обнаружить момент, когда вы хотите, чтобы освободить QThread указатель. То же самое можно сделать с помощью указателей QObject, которые были перемещены в новый поток.

Учитывая, что момент закрытия главного окна - это момент закрытия всего приложения и учитывая, что после закрытия приложения вы не нуждаетесь в дальнейшей обработке, вы можете передать указатель главного окна в качестве родителя для QThread, либо передав его конструктору, либо используя QObject::setParent.

Освобождение ресурсов, полученных в потоке обрабатываемого QThread должны обрабатываться отдельно, как вы не можете сделать QThread объект родитель ресурса управляемых ею - QThread живет в потоке, в котором она была создана, а не в потоке он управляет.

Подробнее here.

Смежные вопросы