网站设置密码访问,网络做翻译的网站,wordpress网站 添加微信支付,河北廊坊seo网站建设网站优化Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字#xff1a;
Qt、
unique、
单一、
QSharedMemory、
共享内存 摘要
今天接着在公司搞我的屎山代码#xff0c;按照…
Qt 利用共享内存实现一次只能启动一个程序 文章目录 Qt 利用共享内存实现一次只能启动一个程序摘要利用共享内存实现一次只能启动一个程序示例代码 关键字
Qt、
unique、
单一、
QSharedMemory、
共享内存 摘要
今天接着在公司搞我的屎山代码按照投资方的要求我需要给我的程序加一个系统自检检测的功能但是呢我的程序已经很烂了一度想重构了他所以这里我就暂时吧这个功能做成了一个进程这样就可以独立运行等后期重构的时候直接拷贝过去。
因为不可抗力的因素我的代码无法直接分享但是咱可以写Demo来说明白。
利用共享内存实现一次只能启动一个程序
记得之前写过一般基于Socket的功能但是我翻我之前的文章没有发现这个东西。就不放链接了这里感兴趣的下伙伴可以自行摸索下。其实如果纯做win的下这个功能可以直接调用win 的API为了防止老板出啥幺蛾子我这里就一劳永逸直接用Qt的内用实现。
为了确保Qt程序有且只有一个实例在运行使用QSharedMemory类来检查是否已经有一个实例在运行。QSharedMemory是Qt中用于进程间共享内存的类利用它在不同的程序实例之间共享一个小段内存。如果一个程序启动时发现这段共享内存已经被创建那么它可以安全地假定已经有另一个实例在运行并可以据此决定退出或采取其他措施
示例代码
#include QApplication
#include QSharedMemory
#include QMessageBoxint main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建一个唯一标识符QString uniqueId myUniqueAppId;// 创建共享内存QSharedMemory sharedMemory(uniqueId);// 尝试附加到共享内存如果附加失败说明没有实例在运行if (!sharedMemory.attach()) {// 尝试创建共享内存段大小为1字节if (sharedMemory.create(1)) {// 创建成功说明当前没有其他实例在运行// 在这里启动你的程序} else {// 创建共享内存失败可能是权限问题等QMessageBox::critical(nullptr, QObject::tr(Error),QObject::tr(Unable to create a single instance of the application.));return 1;}} else {// 能够附加到共享内存说明已经有一个实例在运行QMessageBox::warning(nullptr, QObject::tr(Warning),QObject::tr(An instance of the application is already running.));return 0; // 退出程序}// 你的程序主逻辑// ...return app.exec();
}
这段代码首先试图附加到一个名为myUniqueAppId的共享内存段。如果这一操作失败它接着尝试创建这个共享内存段。如果创建成功这表示当前没有其他程序的实例在运行程序可以继续执行。如果附加成功说明已经有一个实例在运行此时可以显示一个错误消息并退出程序。
注意这里的uniqueId需要是一个对于你的应用来说唯一的标识符。通常你可以使用应用的ID、名称或者其他能够保证唯一性的字符串。