Всем доброго времени суток!
Проблема такая: я пишу многопоточное сетевое приложение на QT. На сервере есть заданное фиксированное кол-во потоков. При подключении клиента создается объект для работы с этим клиентом и помещается в поток. При отключении клиента объект испускает сигнал, при котором сервер должен правильно остановить именно этот поток.
Но в моменте остановки и удаления потока выдает следующую ошибку:
QThread: Destroyed while thread is still running
Видимо, я плохо понимаю, как надо правильно останавливать поток, и поэтому прошу вас помочь!
Создание нового работника и потока для него:
Workers[IndFreePlace] = new Worker(this->nextPendingConnection()->socketDescriptor(), IndFreePlace);
Threads[IndFreePlace] = new QThread(this);
Workers[IndFreePlace]->moveToThread(Threads[IndFreePlace]);
connect(Threads[IndFreePlace], &QThread::started, Workers[IndFreePlace], &Worker::StartWork);
connect(Workers[IndFreePlace], &Worker::StopThread, this, &Server::DisconnectClient);
Threads[IndFreePlace]->start();
Завершение работы с клиентом (DisconnectClient):
delete Workers[ThreadID];
Workers[ThreadID] = nullptr;
Threads[ThreadID]->quit();
Threads[ThreadID]->wait();
delete Threads[ThreadID];
Threads[ThreadID] = nullptr;
Без строки Threads[ThreadID]->wait() выдает ошибку, которую я написал выше. С ней же просто зависает и все.
Заранее большое спасибо всем за ответы! Надеюсь на вашу помощь.
Код "полезной" нагрузки:
void Worker::StartWork()
{
mUserSocket = new QTcpSocket;
mUserSocket->setSocketDescriptor(mSockD);
connect(mUserSocket, &QTcpSocket::disconnected, this, &Worker::StopWork);
qDebug() << "Check\n";
}
Работник посылает сигнал серверу об остановке потока:
void Worker::StopWork()
{
qDebug() << "Client #" << mID << " disconnected\n";
mUserSocket->close();
delete mUserSocket;
mUserSocket = nullptr;
emit StopThread(mID);
}