Название: Удаление объекта в потоке Отправлено: Naihil от Май 12, 2011, 10:54 Здравстуйте!
После прочтения данных постов (http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/ (http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/) и http://labs.qt.nokia.com/2006/12/04/threading-without-the-headache/ (http://labs.qt.nokia.com/2006/12/04/threading-without-the-headache/)) решил переделать логику работы с потоком, но столкнулся с проблемой удаления объекта, помещаемого в поток. Имеется: Код: class CMainWindow : public QMainWindow Как быть в такой ситуации? Название: Re: Удаление объекта в потоке Отправлено: mutineer от Май 12, 2011, 10:56 удаление по deleteLater() вроде происходит в eventLoop потока, которому он принадлежит. Может дело в том, что eventLoop потока уже не работает, поэтому объект и не удаляется?
Название: Re: Удаление объекта в потоке Отправлено: Naihil от Май 12, 2011, 11:00 удаление по deleteLater() вроде происходит в eventLoop потока, которому он принадлежит. Может дело в том, что eventLoop потока уже не работает, поэтому объект и не удаляется? Да, в документации по Qt::QueuedConnection так и написано, в этом-то и проблема. Объект в поток засунули, а как его удалить после этого?Название: Re: Удаление объекта в потоке Отправлено: Igors от Май 12, 2011, 11:30 Когда нитка испустит finished, с ее eventLoop уже покончено, поэтому до deleteLater дело не дойдет (если объект был перенесен с помощью moveToThread). Можно сделать слот где объект будет удаляться и связать его с тем же finished. Хорошо бы смотрелось и создание объекта по сигналу started
Эти требует чуть больше строк, зато просто и надежно Название: Re: Удаление объекта в потоке Отправлено: Naihil от Май 12, 2011, 12:06 Когда нитка испустит finished, с ее eventLoop уже покончено, поэтому до deleteLater дело не дойдет (если объект был перенесен с помощью moveToThread). Можно сделать слот где объект будет удаляться и связать его с тем же finished. Хорошо бы смотрелось и создание объекта по сигналу started Сделал следующим образом:Эти требует чуть больше строк, зато просто и надежно Код: class CMainWindow : public QMainWindow Название: Re: Удаление объекта в потоке Отправлено: Igors от Май 12, 2011, 12:25 Сделал следующим образом: Работать наверное будет но мне лично не нравится :) А вдруг toggled вызовется 2 раза подряд с true? И зачем задействовать closeEvent которое напрямую с ниткой не связано? У Вас есть очень удобное место для создания - сигнал started, а можно и по-простому сделать mpS членом класса нитки (создавать в конструкторе, удалять в деструкторе).Вроде работает, но правильно ли удалять объект, находящийся в другом потоке, пусть и уже остановленном? Нет никакого "находящегося", просто объект хранит указатель на нитку, который используется чтобы засылать события в eventLoop этой нитки - вот и все.Название: Re: Удаление объекта в потоке Отправлено: Naihil от Май 12, 2011, 13:53 Работать наверное будет но мне лично не нравится :) А вдруг toggled вызовется 2 раза подряд с true? Хм, об этом не подумал, но ет можно переделать.И зачем задействовать closeEvent которое напрямую с ниткой не связано? если вызвать "on_actConnectToServer_toggled(false);" в деструкторе, то сигнал finished() не испускается и объект не удаляется. Это, конечно, лечится с помощью qApp->processEvents(), но как-то ет не очень)а можно и по-простому сделать mpS членом класса нитки (создавать в конструкторе, удалять в деструкторе). В данном случае придётся наследоваться от QThread, от чего я и хотел отказаться)Наверно будет лучше создать объект 1 раз при запуске потока и удалять при сигнале destroyed() + слот для управления работой самого объекта |