QT QTcpServer в потоке; как закрыть сервер прослушивания при выходе?

У меня есть подкласс потока, как это

class MyThread : public QThread
{
public:
MyThread (void);
~MyThread (void);

void run();

void stop(); // close server and terminate thread

public slots:
void slotCloseServer();

signals:
void signalCloseServer();

private:
QTcpServer* m_pServer;
};

и run() и общее определение класса изложено ниже

MyThread::MyThread()
{
connect(this, SIGNAL(signalCloseServer()), this, SLOT(slotCloseServer()));
}

void MyThread::run()
{
m_pServer = new QTcpServer();

if(m_pServer->listen(QHostAddress(QHostAddress::LocalHost), 8888) == 0)
{
qCritical("Server listen failed.");
}
else
{
exec();
}
}

void MyThread::stop()
{
emit signalCloseServer();
quit(); // terminate thread
}

void MyThread::slotCloseServer()
{
if (m_pServer && m_pServer->isListening())
{
m_pServer->close();
}
}

Теперь из основной ветки хочу позвонить stop() поэтому он будет сигнализировать экземпляру потока, чтобы закрыть сервер и завершить себя, но он никогда не доберется до slotCloseServer() и порт прослушивания не освобождается.

Любые мысли о том, как освободить сокет сервера до завершения потока?

Спасибо,

1

Решение

Почему бы не вызвать slotCloseServer () из stop ()?

void MyThread::stop()
{
slotCloseServer(); // close server

quit(); // terminate thread
}

void MyThread::slotCloseServer()
{
if (m_pServer && m_pServer->isListening())
{
m_pServer->close();
}
}
0

Другие решения

Я думаю, что для случаев, когда что-то должно быть сделано, когда созданный объект уничтожен (в вашем случае — завершение потока), лучше указать необходимые действия в деструкторе класса этого объекта:

MyThread ::~MyThread (void)
{
m_pServer->close();
}
0

По вопросам рекламы [email protected]