WINFORM 启动器(并行exe)设计方案

一、故事线

当已经有一个完整的项目方案,突然提出需要增加功能支持并行的需求时,通常考虑项目中模块是否支持并行,比如使用了单例模式时,又要模块区分,单例模块将需要修改等等问题。

此时,可以采用启动器方式实现,该方式的优点是:已完成项目只需要增加启动标识的相关功能即可,其他功能可直接使用,极大缩短功能并行的开发周期。

二、启动器

我的项目中需要的启动器本身也是一个winform程序,其中包含多个按钮对应并行多个并行程序,点击按钮后打开一个程序副本。

需要考虑的问题:

1 每个副本只允许执行一次,比如支持四个副本,那么一共只能有一个副本(当然,这是我的需求,如果不考虑可以不做限制),需要做副本检查的方案。

2 单个副本内的项目静态变量是否共享问题。如果共享的话这个方案将失效。经过验证是独立的。

3 如何启动新的exe程序。

三、启动器实现

1 程序可以多开,但启动器必然只能运行一个,此时使用Mutex实现:

var mutex = new Mutex(true, key, out result);

- key为一个唯一标识

- result为结果,如果为false,表示已标记,如果只有你的程序进行该key的设置,那么你的程序已经启动了。

2 启动器中,打开副本程序,使用以下代码:

Process myprocess = new Process();
ProcessStartInfo startInfo = new ProcessStart(path, args);
myprocess.StartInfo = startInfo;
myprocess.StartInfo.UseShellExecute = false;
myprocess.Start();

args为string类型的变量,如果你还熟悉以下代码,那么应该args的第一个元素即为当前的args变量。

path为打开程序路径,注意必须是绝对路径。

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
     //...
}

3 启动器中的副本检查方案,由于单个副本只能打开一次,启动器需要持续跟进副本是否已经终结,并允许用户重启开启。我采用的方案是通过ini配置文件实现:

FileTooler.IniWriteValue("STARTUP", $"CHN{index}", "1", CONFIG_PAHT);

FileTooler.IniWriteValue是我封装的ini方法,具体ini操作参照以下内容:

[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section
    , string key
    , string val
    , string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section
    , string key
    , string def
    , StringBuilder retVal
    , int size
    , string filePath);

这里的关键是第二个参数$"CHN{index}",index对应副本编号,"1"表示开启。

同理,对应的副本程序关闭时,应当调用以下代码更新ini文件。

FileTooler.IniWriteValue("STARTUPA20", $"CHN{index}", "0", CONFIG_PAHT);

除了开始副本时和结束副本时设置ini文件外,需要增加一个timer进行持续检查:

private void timer1_Tick(object sender, EventArgs e)
{
    for (int i = 0; i < 4; i++)
    {
        var chk = Syscan.File.FileTooler.IniReadValue("STARTUPA20", $"CHN{index}", CONFIG_PAHT)=="1";
        btns[i].Text = $"通道{index}" + (chk? " 已启动" : "");
        btns[i].Enabled = !chk;
    }
}

这里可以看出对应的通道设置的是button控件,通过enable和文字描述提醒用户是否可以重新开启。

Timer的使用也不再这里赘述,不了解的请移步:

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer.aspx

四、其他

在这个框架下如果想支持部分数据共享,最简单的方案是把共享部分放在一个数据库中,非共享单独分放即可。

五、总结

该方案主要涉及的技术点包括:

1 基于Mutex单一进程检查

2 ini文件读写

3 Process方式启动新程序

4 Timer的使用

至此启动器方案确定,如有任何疑问可以留言。

时间: 2024-10-01 12:58:03

WINFORM 启动器(并行exe)设计方案的相关文章

WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放

WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放 开发环境: Microsoft Windows 7 SP1 Microsoft.NET Framework 4.0 (x64) 1. 首先, App.config: <?xml version="1.0" encoding="utf-8" ?><configuration>  <runtime>    <gcConcurrent enabled=&quo

Winform常用操作

>> c#操作cmd命令 using System.Diagnostics; private string RunCmd(string command) { //实例一个Process类,启动一个独立进程 Process p = new Process(); //Process类有一个StartInfo属性,这个是ProcessStartInfo类,包括了一些属性和方法,下面我们用到了他的几个属性: p.StartInfo.FileName = "cmd.exe"; //设

从 C#编写的Exe里面提取图标和图片

记得原来是可以通过PE直接提取Exe里面的图片的,不知道为什么不能用了,下面是通过加载程序集反射出Resources 里面的图片或者图标: 提取结果直接存放到编译目录了,不知道向左向右,自己又回到Winform了 //从Exe里面提取图标和图片 Assembly assm = Assembly.LoadFrom("Swtpro4.exe"); HashSet<string> l_strHashType = new HashSet<string>(); forea

Winform JAVA程序破解,以及反混淆工具

对于winform生成的exe程序,可以通过ILSpy.exe工具来进行破解. 可以通过ILSpy下载 有的程序会使用混淆工具进行混淆,这样反编译的源代码可读性很差,可以使用反混淆工具对其进行反混淆 de4dot de4dot用法 使用命令行到de4dot目录中,调用de4dot.exe(如果是64位调用de4dot64.exe) 后续添加要反混淆的exe目录执行后就可以成功. 反编译java程序,需要用到jd_gui jd-GUI

同时装了Python3和Python2,怎么用pip

作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 转帖-[官解]Windows上Python2和3如何兼容 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.exe改个名字(嗯,我也这样讲过,在此纠正一下),这样区分开两个可执行文件的名字,但是这样做

Windows上Python2和3兼容问题

python2和3一起装在windows中,pip装包会出现问题,python社区给出了以下解决方案. 我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是Python3来运行代码(当然前提是你已经成功安装了Python2和Python3). 如果你有一个Python文件叫 hello.py,那么你可以这样用Python2运行它py -2 hello.py

[python]_ELVE_pip2和pip3如何共存

作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有,转载请联系作者获得授权. 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.exe改个名字(嗯,我也这样讲过,在此纠正一下),这样区分开两个可执行文件的名字,但是这样做有一个重大的隐患,就是修改了名字的那个python对应的pip将无法使用. 官方的解

windows下多个python版本共存,pip使用

一.同时装了Python3和Python2,怎么区分 了解python的人都知道python有2.x版本和3.x版本,而python3.x版本不向下兼容,但是根据具体的需要,有时候要2.x和3.x共存,python共存本身没有问题,只是需要设置一些环境变量和修改一些东西来让它更容易使用.本文主要说明的是windows环境 首先当然是安装你需要的两个不同版本的python,这里我安装的是2.7和3.5的,两个版本安装顺序无所谓. 接下来就是检查环境变量,缺少的我们需要添加.先找到环境变量的位置.

windows下python2和python3共存

相信很多朋友都在网上搜索过python多版本共存的问题. 多说的说法都是修改python.exe的名字为python2.exe或者python3.exe. 但是我按照这样的方法却总是不成功. 修改python.exe的名字后,运行pip总是报 Fatal error in launcher: Unable to create process using '"'这个错误. 其实不用修改原来python.exe的名字,只需要复制一份python.exe文件,修改名字为python2.exe或者pyt