QT QTcpServer in thread;如何在退出时关闭侦听服务器

QT QTcpServer in thread; how to close listening server on exit?

本文关键字:服务器 退出 in QTcpServer thread QT      更新时间:2023-10-16

我有一个这样的线程子类

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()并且侦听端口不会释放。

关于如何在终止线程之前释放服务器套接字的任何想法?

谢谢

为什么不从 stop() 调用 slotCloseServer()?

void MyThread::stop()
{
    slotCloseServer(); // close server
    quit(); // terminate thread
}
void MyThread::slotCloseServer()
{
    if (m_pServer && m_pServer->isListening())
    {
        m_pServer->close();
    }
}

我认为对于在销毁创建的对象时应该执行某些操作的情况(在您的情况下是线程终止),最好在该对象的类析构函数中声明所需的操作:

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