第二人生的源码分析(七十六)判断程序运行多个实例

随着多任务系统的流行,可以轻易地把同一个程序同时运行多个实例,这对于一般的应用程序来说,是非常有用的,也大大地提高电脑的使用率。但是对于像第二人生这样的游戏来说,运行多个实例,是不需要的,也是不现实的。因为它需要非常多的 CPU计算,独占CPU还不够用,别说运行多个实例了,并且它是全屏运行的游戏,多个程序运行也不必要。那么第二人生里是使用什么方法来实现跨平台的多个实例运行的检测呢?下面就来看看这段代码:
#001 bool LLAppViewer::anotherInstanceRunning()
#002 {
#003     // We create a marker file when the program starts and remove the file when it finishes.
#004     // If the file is currently locked, that means another process is already running.
#005 
 
获取作标记文件的路径和名称。
#006     std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME);
#007     llinfos << "Checking marker file for lock..." << llendl;
#008 
 
用只读的方式打开文件。
#009     //Freeze case checks
#010     apr_file_t* fMarker = ll_apr_file_open(marker_file, LL_APR_RB);    
打开文件成功,说明已经存在这个文件,如果不存在文件,肯定就不存在多个实例了。
#011     if (fMarker != NULL)
#012     {
 
说明文件已经存在,先把只读方式的文件关闭。
#013         // File exists, try opening with write permissions
#014         apr_file_close(fMarker);
 
用写的方式打开这人文件。
#015         fMarker = ll_apr_file_open(marker_file, LL_APR_WB);
 
如果这样打开文件不成功,说明已经有一个实例已经运行,因为前一个实例用只写的方式打开文件的。
#016         if (fMarker == NULL)
#017         {
#018             // Another instance is running. Skip the rest of these operations.
#019             llinfos << "Marker file is locked." << llendl;
 
打开文件不成功,说明已经有一个实例运行。
#020             return TRUE;
#021         }
 
下面锁住这个文件,不允许再用写的方式打开。
#022         if (apr_file_lock(fMarker, APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) //flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
#023         {
#024             apr_file_close(fMarker);
#025             llinfos << "Marker file is locked." << llendl;
#026             return TRUE;
#027         }
#028         // No other instances; we'll lock this file now & delete on quit.
 
用写的方式能打开文件,说明没有另外的实例运行。
#029         apr_file_close(fMarker);
#030     }
#031     llinfos << "Marker file isn't locked." << llendl;
#032     return FALSE;
#033 }
 
上面这段代码是通过使用一个不共享写文件的方法来判断是否已经存在另外一个实例,这就是第二人生跨平台检测是否有第二个实例运行的方法。
 

转载于:https://www.cnblogs.com/ajuanabc/archive/2008/05/30/2464071.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的码资涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些码资特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资都能为你提供宝贵的学习和实践机会。通过学习和运行这些码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些码资进行课程实践、课外项目或毕业设计。通过分析运行码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保码资的可运行性和易用性,特别注意了以下几点:首先,每份码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些码资,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值