我有一个这样的线程子类
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()
并且侦听端口无法获得释放。
关于如何在终止线程之前释放服务器套接字的想法?
谢谢,
答案 0 :(得分:0)
为什么不从stop()调用slotCloseServer()?
void MyThread::stop()
{
slotCloseServer(); // close server
quit(); // terminate thread
}
void MyThread::slotCloseServer()
{
if (m_pServer && m_pServer->isListening())
{
m_pServer->close();
}
}
答案 1 :(得分:0)
我认为,当一个被创建的对象被销毁时(在你的情况下是线程终止)应该做的事情更好地说明在该对象的类的析构函数中所需的动作:
MyThread ::~MyThread (void)
{
m_pServer->close();
}