我正在运行一个阻塞 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;
}
如何从另一个线程关闭服务器?还是只有使用非阻塞事件?
尊敬的各位。
为什么不等到 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::requestInterruption 和 isInterruptionRequested() 方法,而不是创建自己的 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;
}