QT QTcpServer在线程中;如何在退出时关闭侦听服务器?

时间:2012-10-10 14:10:57

标签: c++ qt qthread 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()并且侦听端口无法获得释放。

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

谢谢,

2 个答案:

答案 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();
}