QT开发中文网

如果程序运行中被关机了,单例被卡死

是的,如果程序运行中突然关机或意外终止,可能导致单例被锁定而无法释放。这种情况下,可以考虑添加一个超时机制,以确保在一段时间内没有新实例连接时,能够解锁并释放单例。

以下是修改后的代码示例:

#include <QtCore/QCoreApplication>
#include <QtCore/QSharedMemory>
#include <QtCore/QLocalServer>
#include <QtCore/QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 使用唯一的共享内存名称
    QString sharedMemoryKey = "YourUniqueSharedMemoryKey";

    // 创建一个共享内存对象并尝试加锁
    QSharedMemory sharedMemory(sharedMemoryKey);
    if (!sharedMemory.create(1))
    {
        qDebug() << "Another instance is already running.";

        // 启动一个定时器,在指定时间后强制解锁并释放共享内存
        QTimer::singleShot(5000, [&sharedMemory]() {
            qDebug() << "Force releasing the shared memory.";
            sharedMemory.unlock();
            sharedMemory.detach();
        });

        return 0;
    }

    // 创建一个本地服务器对象,并尝试监听指定名称
    QString localServerName = "YourUniqueLocalServerName";
    QLocalServer localServer;

    if (localServer.listen(localServerName))
    {
        QObject::connect(&localServer, &QLocalServer::newConnection, [](void) {
            qDebug() << "Another instance tried to connect.";
        });

        qDebug() << "This is the first instance.";
        return a.exec();
    }

    qDebug() << "Failed to listen for another instance.";

    return 0;
}

在修改后的代码中,添加了一个定时器,在程序启动时开始计时。如果发现已经有其他实例运行,则等待一段时间(例如5秒)后强制解锁并释放共享内存。这样可以避免单例被卡死问题。

请根据自己的需求和实际情况调整超时时间。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=10562

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?