Qt QML 杂记

Qt QLocalServer Unable to start

2020-08-20  本文已影响0人  赵者也

首先看如下的代码:

    server = new QLocalServer(this);
    if (!server->listen(ServerName)) {
        QMessageBox::critical(this, tr("Local Fortune Server"),
                              tr("Unable to start the server: %1.")
                              .arg(server->errorString()));
        return;
    }

这是 Qt 的 IPC 解决方案的示例中的一段代码,它的作用是运用 QLocalSocket 和 QLocalServer 进行进程间的连接通信,这在正常情况下是没有问题的。

但是如果我们创建的 QLocalServer 服务器进程出现异常终止时(比如在 Qt Creator 中强制终止进程),我们再次启动该进程时,就会弹出上面的 QMessageBox,无法使用 QLocalServer 再次在同一名称上进行监听,我们必须更改监听的服务名称才能再次启动它,这在运行环境中是不可能被接受的。

那么如何才能仍然使用先前的服务名称,继续顺利工作呢?

在 Qt 的帮助文档中有指出:

在 Unix 上,如果服务器没有关闭就崩溃了,监听将失败,并使用 AddressInUseError 标记。要创建新服务器,应该删除该套接字文件。

也就是说如果服务器没有正常退出,我们需要删除套接字文件。最好的办法是修改我们的使用方式在每次开始之前调用 bool QLocalServer::removeServer ( const QString & name ) 接口:

    server = new QLocalServer(this);
    server->removeServer(ServerName); // 或使用 QLocalServer::removeServer(ServerName);
    if (!server->listen(ServerName)) {
        QMessageBox::critical(this, tr("Local Fortune Server"),
                              tr("Unable to start the server: %1.")
                              .arg(server->errorString()));
        return;
    }

参考链接: not able to start qlocalserver

上一篇下一篇

猜你喜欢

热点阅读