Корректное завершение QThread
Разбираюсь как работает QThread. Есть вот такой метод:
void InterfaceController::updateAvailableInterfaces()
{
QStringList allInterfacesList = getAllAlphaInterfaces();
for (int i = 0; i < allInterfacesList.size(); i++)
{
if (!interfaces.contains(allInterfacesList.at(i)))
{
addNewInterface(allInterfacesList[i]);
}
}
QMutableMapIterator<QString, InterfaceItem*> it(interfaces);
while (it.hasNext())
{
it.next();
if (!allInterfacesList.contains(it.key()))
{
removeInterface(it.key());
}
}
}
Создаю и запускаю поток:
void InterfaceController::addNewInterface(const QString& nameNewInterface)
{
Logger::writeLogInfo("{}: Connected interface with name {}", __func__, nameNewInterface.toStdString());
auto *interfaceItem = new InterfaceItem;
interfaceItem->name = nameNewInterface;
interfaceItem->interface = new Interface(nameNewInterface);
interfaceItem->thread = new QThread;
QObject::connect(interfaceItem->thread, &QThread::finished, interfaceItem->interface, &Interface::deleteLater);
QObject::connect(interfaceItem->thread, &QThread::finished, interfaceItem->thread, &QThread::deleteLater);
interfaceItem->interface->moveToThread(interfaceItem->thread);
interfaceItem->thread->start();
interfaces.insert(nameNewInterface, interfaceItem);
}
Удаляю поток:
void InterfaceController::removeInterface(const QString& nameRemoveInterface)
{
Logger::writeLogInfo("{}: Disconnected interface with name {}", __func__, nameRemoveInterface.toStdString());
auto *interfaceItem = interfaces.value(nameRemoveInterface);
if (interfaceItem->thread->isRunning())
{
interfaceItem->thread->exit();
}
interfaces.remove(nameRemoveInterface);
}
Если с созданием всё вроде гуд, то вот с удалением вопросы, по сути я его просто останавливаю, как корректно остановить и удалить поток вместе с объектом, который в него передавался?
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
QThread* thread = new QThread();
Worker* fdrun = new anMyObject();
fdrun->moveToThread(thread);
connect(thread, SIGNAL(started()), fdrun, SLOT(Processing()));
connect(thread, SIGNAL(finished()), fdrun, SIGNAL(finished()));
connect(fdrun, SIGNAL(finished()), fdrun, SLOT(deleteLater())); //!!
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); //!!
thread->start();
и в потоке по завершению
emit finished();