@Sazoks

Почему не получается правильно завершить поток?

Всем доброго времени суток!
Проблема такая: я пишу многопоточное сетевое приложение на 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);
}
  • Вопрос задан
  • 308 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы