当前位置: 首页 > news >正文

做直播网站赚钱谷歌官方app下载

做直播网站赚钱,谷歌官方app下载,宜宾网络推广,网站建设维护培训Qt实现检测软件是否多开 在桌面软件开发中,软件通常要设置只允许存在一个进程,像一些熟知的音乐软件,QQ音乐这种。而这些软件在限制只有一个进程的同时,通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运…

Qt实现检测软件是否多开

在桌面软件开发中,软件通常要设置只允许存在一个进程,像一些熟知的音乐软件,QQ音乐这种。而这些软件在限制只有一个进程的同时,通常还会有双击桌面图标唤醒已运行的后台进程的功能。关于双击桌面唤醒已运行进程的方法,请看这篇文章:
本文中所介绍的各种方法,都基本遵循一个基本逻辑,即:“还未完成”
监测同一个资源,根据资源的占用情况,来决定是否能够启动。

平台特殊

操作系统提供了一些API供我们使用,所以接下来介绍一些使用特定系统API的方法。

windows

CreateMutex

image.png
具体API内容请看:MS Learn CreateMutexW
简单来讲,就是创建一个指定命名的互斥对象。当这个互斥对象已存在时,函数将会返回一个错误。

如果 lpName 与现有事件、信号量、可等待计时器、作业或文件映射对象的名称匹配,则函数将失败, GetLastError 函数返回 ERROR_INVALID_HANDLE

思路

通过这个错误,我们就能判断互斥对象创建成功还是失败,进一步根据创建结果去判断有没有实例正在运行。但是要注意一个点,在软件退出的时候,需要将软件启动时创建的互斥对象销毁掉。

代码
    HANDLE m_had = CreateMutex(NULL, TRUE, name.toStdWString().c_str());if (GetLastError() == ERROR_ALREADY_EXISTS){return false;}else{return true;}// 解锁if (m_had != NULL){ret = CloseHandle(m_had);if (ret){m_had = NULL;}}

直接检测进程名称

当然,要实现这种需求最简单的就是直接检测进程的运行。以Windows下的应用程序拓展名(exe)为例:

bool checkProcessRunning(const QString& processName, QList<quint64>& listProcessId)
{bool res = false;HANDLE    hToolHelp32Snapshot;hToolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);PROCESSENTRY32    pe = { sizeof(PROCESSENTRY32) };BOOL  isSuccess = Process32First(hToolHelp32Snapshot, &pe);while (isSuccess){size_t len = WideCharToMultiByte(CP_ACP, 0, pe.szExeFile, wcslen(pe.szExeFile), NULL, 0, NULL, NULL);char* des = (char*)malloc(sizeof(char) * (len + 1));WideCharToMultiByte(CP_ACP, 0, pe.szExeFile, wcslen(pe.szExeFile), des, len, NULL, NULL);des[len] = '\0';if (!strcmp(des, processName.toStdString().c_str())){listProcessId.append(pe.th32ProcessID);res = true;}free(des);isSuccess = Process32Next(hToolHelp32Snapshot, &pe);}CloseHandle(hToolHelp32Snapshot);return res;
}

通用方案

对于需要跨平台开发的同学们,上面说的系统API就没办法满足一套代码就可以实现需求。所以下面介绍一些使用Qt封装的一些上层接口的方法。

QLocalServer + QLocalSocket

通过启动一个本地的socket服务,当软件启动时,连接对应的socket服务,根据服务的连接情况,来确定是否已经有实例运行了。

// 创建socket,连接服务
QLocalSocket socket;
socket.connectToServer("server_name", QIODevice::WriteOnly);
if (socket.waitForConnected(500)) {// 代表有实例已经运行return;
}// 如果没有实例运行,则创建QLocalServer
m_pLocalServer = new QLocalServer();if (!localServer.listen("server_name")){// 监听失败处理
}

QSharedMemory

在软件运行时,绑定到指定的共享内存中,如果共享内存不存在,则附加成功,也就意味着当前没有程序正在运行。反之,则代表程序正在运行。

//通过共享内存,让程序只产生一个运行实例
QSharedMemory sharedMemory("xxx");
if (sharedMemory.attach(QSharedMemory::ReadOnly))
{//已创建有共享内存return 0;
}
//创建共享内存,空间大小为1字节
sharedMemory.create(1);

总结

看到这里,不难发现,除了直接获取进程是否存在,其余实现需求的方法归根结底就是一个路子:
进程间通信。 所以只要能够实现进程间通信的方法,都可以用来实现这个需求,哪怕是 RPC。

http://www.hkea.cn/news/438223/

相关文章:

  • 网站建设的仿站seo顾问收费
  • 珠宝行业做网站的好处株洲seo排名
  • java web开发网站开发cpa推广接单平台
  • 广西南宁网络营销网站网站权重优化
  • 黄山网站设计公司营销网站建设多少钱
  • 网站建设招标评分表湖南关键词优化推荐
  • 淘宝上成都网站建设如何制作视频网站
  • 最吃香的男生十大手艺5g网络优化
  • 河源哪里做网站网络项目怎么推广
  • 网站闭关保护怎么做广州百度seo 网站推广
  • 可以在线做动图的网站近期重大新闻事件
  • 伊犁州建设局网站怎么做微信小程序
  • 做网站需要买主机那新媒体营销方式有几种
  • 网络推广seo公司seo排名的方法
  • 南山做网站多少钱百度资讯
  • 西安哪里有做网站的小学生收集的新闻10条
  • 做游戏网站有几个要素seo网站关键词优化报价
  • 蓬业东莞网站建设技术支持东莞做网站公司首选
  • 网站版式设计获客渠道有哪些
  • 今日军事新闻简短扬州seo优化
  • 国外好看的教育类网站模板下载东莞做网站最好的是哪家
  • 微擎与wordpress快速优化seo软件推广方法
  • 英文网站设计哪家好免费网站搭建
  • 网站建设公司 销量深圳谷歌seo公司
  • 新蔡哪有做网站建设的全球疫情今天最新消息
  • 怎么做平台网站百度seo报价方法
  • 帮人做网站 怎么收费怎么用网络推广
  • 网站排名优化建设百度广告投放技巧
  • 文件服务器网站搭建教程好的竞价托管公司
  • 黑龙江省城乡和住房建设厅网站首页百度链接地址