1

私はこのようなスレッドサブクラスを持っています

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()到達することはなく、リスニングポートは解放されません。

スレッドを終了する前にサーバーソケットを解放する方法について何か考えはありますか?

ありがとう、

4

2 に答える 2

0

stop() から slotCloseServer() を呼び出さないのはなぜですか?

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

    quit(); // terminate thread
}

void MyThread::slotCloseServer()
{
    if (m_pServer && m_pServer->isListening())
    {
        m_pServer->close();
    }
}
于 2012-10-11T03:38:46.133 に答える
0

作成されたオブジェクトが破棄されたときに何かを行う必要がある場合(スレッドの終了の場合)、そのオブジェクトのクラスのデストラクタで必要なアクションを記述する方がよいと思います:

MyThread ::~MyThread (void)
{
    m_pServer->close();
}
于 2012-10-11T11:15:38.840 に答える