Есть несколько потоков (Qt шных), в которых идет прием по клиентским сокетам.
по нажатию кнопки, нужно корректно завершить все потоки, предварительно закрыв соединение в этих потоках.
Корректен ли такой подход, который привожу ниже:
код потока клиента
void QMMNClientThread::run()
{
mmnClient->connectToServer();
exec();
}
void QMMNClient::disconnectFromServer()
{
fmustReconnect = false;
if(fsocket->state() == QAbstractSocket::ConnectedState)
{
fsocket->close();
fsocket->waitForDisconnected();
}
}
при дисконекте клиента, выдерживаю паузу в 2 секунды и делаю реконтект и так вечно пока не надо принудительно завершить работу потока
void CEC::startClient()
{
for(int i=0;i<1;i++) //в будущем тут будет несколько потоков
{
if(!mmnClientThread[i]) mmnClientThread[i] = new QMMNClientThread(this); //создаем поток
mmnClientThread[i]->mmnClient->remoteHost = Host[i]; //задаем к кому подключаться
mmnClientThread[i]->mmnClient->remotePort = Port[i];
connect(mmnClientThread[i]->mmnClient,SIGNAL(frameReceived(int)),this,SLOT(data_receive(int))); //обработка принятых данных
connect(mmnClientThread[i]->mmnClient,SIGNAL(connected(int)),this,SLOT(chan_connected(int)));
connect(mmnClientThread[i]->mmnClient,SIGNAL(disconnected(int)),this,SLOT(chan_disconnected(int)));
connect(this,SIGNAL(disconnectClient()),mmnClientThread[i]->mmnClient,SLOT(disconnectFromServer())); //тут я буду слать сигнал потоку что бы он отключил сокет
mmnClientThread[i]->start(); //запускаю поток
}
}
void CEC::stopClient()
{
for(int i=0;i<1;i++)
{
if(mmnClientThread[i])
{
emit(disconnectClient()); //шлю сигнал сокету в потоке на принудительное отключение
disconnect(mmnClientThread[i]->mmnClient); //отключаю все сигналы/слоты
mmnClientThread[i]->quit(); //закрываю поток
mmnClientThread[i]->wait(); //жду
delete mmnClientThread[i]; //удаляю поток
mmnClientThread[i] = NULL;
}
}
}
До этого я не слал сигнал в поток клиента, и иногда прога вылетала, так как сокет успевал подать сигнал о приеме данных, но сам поток уже уничтожен.
После внесения этой коррективы вроде бага на наболюдаю. Подскажите с точки зрения Qt грамотно ли я прибиваю сокет/поток?