如何实现程序的重新启动(windows环境下)

背景:

在游戏程序的开发中,经常会碰到这样的情况,运行游戏更新程序后需要重新启动更新程序,在游戏内修改视频等相关设置后需要重新启动游戏程序,这样的操作该如何实现呢?

解决方案:

一种解决方案是通过等待来启动新的程序,但是这样的实现方式在极端情况下会出现问题,假设某游戏程序每次在一个物理机上只允许启动一个进程,如果关闭旧的进程因为一些原因而造成延迟,那么启动新的进程时会失败,试想游戏更新程序结束后,提示玩家游戏将重启,而游戏并没有重启,这种体验是相当糟糕的。

另一种解决方案,为了保证程序A关闭后与程序B再打开,在windows环境下有一种很常用的方法——批处理,由于批处理中的方法都是顺序执行的,关闭程序A打开程序B的操作可以保证同步执行,将杀死进程与启动进程的功能写入批处理,在需要重启的地方,调用API执行该批处理即可。

/*
author:	coffeecat
brief : All the code below has been tested.
date  :	2014/10/21
*/
#include "stdafx.h"
#include <iostream>

using namespace std;

void Restart()
{
	FILE* pf;
	::DeleteFile(L"restart.cmd");							//确保删除上次遗留下的批处理文件
	errno_t err = ::_wfopen_s(&pf, L"restart.cmd", L"w");	//“w”表示打开一个空文件以进行写入。如果该文件存在,其内容将被销毁。
	if( err == 0 )											//restart.cmd不存在时,err == 0
	{
		char szExeName[1024];
		GetModuleFileNameA( NULL, szExeName, 1024);			//获取进程的名称
		fprintf( pf, "@echo off\n:a\n taskkill /f /im restart.exe \n start \"\" \"%s\" \ndel %%0", szExeName);
                //restart.exe为需要重启的进程名称
		//taskkill /f(指定要强行终止的进程) /im( image name 可以理解为指定要终止的进程名名称)
		//%%0在批处理中表示%0,del %%0(删除批处理自身)
		fclose( pf );
	}
	else
	{
		cout << "can not open restart.cmd" << endl;
	}  

	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory( &si, sizeof si );
	ZeroMemory( &pi, sizeof pi );
	si.cb = sizeof si;
	si.dwFlags = STARTF_USESHOWWINDOW;
	si.wShowWindow = SW_HIDE;
	TCHAR winSysDir[1024];
	ZeroMemory( winSysDir, sizeof winSysDir );
	::GetSystemDirectory( winSysDir, 1024 );
	std::wstring appName = winSysDir;
	appName += L"\\cmd.exe";
	BOOL bRet = CreateProcess(
		appName.c_str(),
		L"/c restart.cmd",					//执行字符串指定的命令然后终断
		NULL,
		NULL,
		FALSE,
		0,
		NULL,
		NULL,
		&si,
		&pi);  

	if ( bRet == FALSE )
	{
		int err = GetLastError();
		cout << "can not restart test, error code:" << err << endl;
	}
} 

int main()
{
	int input, curPid;
	curPid = GetCurrentProcessId();
	cout << "Current process Id:" << curPid << endl;
	cout << "Do you need to restart the program ? (input 1 for restart, else do not restart)" << endl;
	cin >> input;
	if (input == 1)
	{
		Restart();
	}
	system("pause");
	return 0;
}

执行上述代码,输入1会关闭当前进程,重新打开一个新的进程。

运行结果:

以下为进程A,待输入1后会被关闭。

以下为进程B,进程A被关闭后,进程B将会被创建。

可以看到两个进程的PID不同,符合预期。

时间: 2024-10-29 19:06:24

如何实现程序的重新启动(windows环境下)的相关文章

第一部分:使用iReport制作报表的详细过程(Windows环境下)

提示:在有些板块,文中的图片看不到,建议到我的blog浏览文章:http://blog.csdn.net/jemlee2002/文章将会涉及3个方面的内容: 第二部分:使用Jasperreport作为报表控件开发胖客户端报表应用 第三部分:使用Jasperreport作为报表控件开发Web报表应用 1.前言 在网络上可以搜索到很多使用iReport和Jasperreport配合实现各种报表任务的文章,但是我觉得很少有一篇(几乎没有)做一个比较详细的介绍如何使用iReport制作报表的全过程,我所

在windows环境下基于sublime text3的node.js开发环境搭建

首先安装sublime text3,百度一堆,自己找吧.理论上sublime text2应该也可以.我只能说一句:这个软件实在是太强悍了. 跨平台,丰富的插件体系,加上插件基本上就是一个强悍的ide了.目前我在使用的主要是Emmet.Python.还有一些格式化的插件(xml,json),加上这次安装的node.js. node.js的安装就不用多说了,直接http://nodejs.org/ 点击install下载window版本的安装程序后安装即可.默认的安装会将安装目录加到path环境变量

定制windows环境下cmd替代软件ConEmu

定制windows环境下cmd替代软件ConEmu 公认的是Windows环境下命令行界面太难用. 不管是cmd还是powershell都不顺手!!窗口宽度不能全屏,字体太难看还不能调整,窗口背景不能更换,永远的黑白配,最痛苦的是复制和粘贴.都不知道MS是怎么想的?搞个这么个反人类的东西出来,还万年不变,从Windows诞生到Windows7不论是桌面版还是服务器版都一样,到了windows8/windows10换成powershell一样的鸡肋. 在百度搜了一下,找到cmd的替代软件conem

《高可用MySQL》1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容. Master-Slave这东西吧.在很多公司都是标配.开发中基本天天都用.遇到的问题自然也不少(如主从不同步,Master宕机).但操作权限很有限.有些东西,仅仅有自己看了.做了,才干真正知道原理是什么,也才干更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从

Windows环境下Android Studio v1.0安装教程

Windows环境下Android Studio v1.0安装教程 Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SDK) (813 MB) exe(不包含SDK) (250 MB) zip (235 MB) Mac dmg (234 MB) zip (233 MB) Linux: zip (233 MB) 说明: 32位系统和64位系统是同一个安

代理服务器的理解(1):Windows环境下的代理服务器设置

浏览器中的代理服务器设置 Windows系统接口提供的代理服务器设置是一个全局的代理服务器的设置,如图所示,这里就不多解释: 各个浏览器在使用代理设置的时候,可以主动地获取代理设置亦或是不使用该代理设置,例如Chrome浏览器如果要使用代理设置,只能在图中所示的位置进行更改,所以简单地(不使用辅助性工具)为Chrome设置代理,只能通过更改系统全局代理设置(当然此时不会影响不使用该代理设置的进程),如图: 而360浏览器可以有几种选择: 它可以使用自己程序配置的代理,使用IE的代理(应该就是系统

【转】Windows环境下Android Studio v1.0安装教程

原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/158-androidstudio-v1-0-win-install Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包.要求:JDK 7以及以上版本. Android Studio安装文件. Windows:exe(包含SDK) (813 MB)exe(不包含

《高可用MySQL》读书笔记1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容.Master-Slave这东西吧,在许多公司都是标配,开发中基本天天都用,遇到的问题自然也不少(如主从不同步,Master宕机),但操作权限非常有限.有些东西,只有自己看了.做了,才能真正知道原理是什么,也才能更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从官

Windows环境下通过Git来管理自己的Android代码

前面已经介绍了在Windows下使用git工具来下载Android的源码,Windows环境下通过Git得到Android源代码,这里记录我使用git工具来管理我自己的代码,git是一种分布式的项目管理工具而CVS及SVN都是集中式的版本控制系统集中式版本控制系统最大的毛病就是必须联网才能工作,分布式版本控制系统根本没有"中央服务器",每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上,分布式和集中式通过以下两张图会清楚点 Window