屏蔽其他线程的QLocalServer

问题描述 投票:0回答:1

我正在运行一个阻塞 QLocalServer 在一个线程中。

void QThread::stopServer()
{
    m_abort = true;
    m_server.close(); // QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread 
}

void QThread::run()
{
    m_server = new QLocalServer();
    m_server->Listen("PipeName");
    while (!m_abort)
    {
        if (m_server->waitForNewConnection())
        {
            // handle the connection
        }
    }
    delete m_server;
}

如何从另一个线程关闭服务器?还是只有使用非阻塞事件?

尊敬的各位。

qt qthread qtcpsocket qlocalsocket qlocalserver
1个回答
0
投票

为什么不等到 run() 关闭或删除连接本身,然后在 m_abort 将被设置?

void QThread::stopServer()
{
    m_abort = true; // shall be thread-safe (std::atomic<bool>, etc)
    wait(); // It’s optional to use it here
}

void QThread::run()
{
    m_server = new QLocalServer();
    m_server->Listen("PipeName");
    while (!m_abort)
    {
        if (m_server->waitForNewConnection())
        {
            /* Most likely you cannot handle the connection
            which was closed in another place, therefore сlose (delete)
            it after leaving here */
        }
    }
    delete m_server;
}

请注意,您可以使用标准的 QThread::requestInterruptionisInterruptionRequested() 方法,而不是创建自己的 m_abort 变量。

从文档中可以看到。

这个函数可以用来使长期运行的任务可以干净地中断。从不检查或操作这个函数返回的值是安全的,但是在长期运行的函数中建议定期这样做。注意不要太频繁地调用它,以保持较低的开销。

所以你可以写。

void QThread::stopServer()
{
    requestInterruption();
    wait(); // It’s optional to use it here
}

void QThread::run()
{
    m_server = new QLocalServer();
    m_server->Listen("PipeName");
    while (!isInterruptionRequested())
    {
        if (m_server->waitForNewConnection(100)) // 100 ms for not to call too often
        {
            /* Most likely you cannot handle the connection
            which was closed in another place, therefore сlose (delete)
            it after leaving here */
        }
    }
    delete m_server;
}
© www.soinside.com 2019 - 2024. All rights reserved.