在独立的控制台和windows应用程序之间传递信息
本文关键字:之间 信息 应用程序 windows 独立 控制台 | 更新日期: 2023-09-27 18:12:50
我有两个独立的程序,一个是控制台应用程序,另一个是windows应用程序。
我的windows应用:
- 具有图形界面、按钮和其他功能。
-
其中一个名为"research"的按钮:当我点击它时,我用这行代码启动控制台应用程序:
string strResult = ProcessHelper.LaunchProcessWaitForPipedResult("MyExecFile.exe", strArguments, 10 * 60 * 1000, true); // 10 mins max
我的控制台应用:
- 查询一个目录下的所有文件。
我的问题:
我想在windows应用程序上创建一个进度条来显示控制台应用程序的进度。问题是我不知道如何在两个进程之间传递这个信息。唯一的限制是不能使用数据库或文件。
给定同一用户会话中的两个进程,并且希望避免会话之外的任何通信,我会考虑三个选项:
1。使用命名管道
父进程使用一个随机名称创建一个命名管道(并通过打开该名称来确认该名称未被使用)。它将该名称传递给子进程。使用一个简单的协议,允许子节点发送更新。
有许多挑战需要克服:
- 获取逻辑以确保名称是唯一的(命名管道名称是全局的)。
- 确保没有其他进程可以连接(默认的命名管道ACL限制连接到会话:这个可能就足够了)。
- 处理不同父进程不支持进度更新的情况。
- 处理子进程或父进程崩溃。
- 避免在通信协议上过于聪明,但允许发展空间(当需要的不仅仅是一个简单的进度条时会发生什么?)
2。使用共享内存
在这种情况下,对象的名称默认情况下是会话的本地名称。默认情况下,这是更安全的。
父进程创建了足够大的共享内存(对于一个简单的进程更新:不多),一个互斥锁和一个事件。
然后,父进程与GUI并发地等待事件信号,当它进入互斥锁并读取共享内存的内容时。然后取消事件设置并离开互斥锁。同时发送更新,子线程进入互斥锁,更新内存,并在离开互斥锁之前设置事件。
这里的挑战包括:
- 定义共享内存布局。如果没有共享程序集,这很可能容易出错。
- 避免其他人使用共享内存和同步对象。net使事情变得更加困难:在Win32中,我会使句柄可继承,因此不需要命名对象(除了调试)并直接传递给子进程。 获得共享内存、互斥锁和事件的正确排序是至关重要的。内存损坏和更微妙的错误等待任何错误。
- 使用共享内存做可变长度数据比较困难,对于简单的进度计数来说不是问题,但客户总是想要更多。
我可能首先考虑命名管道(或者如果我想要更大的灵活性,可能会考虑自定义WMI类型)。BUT我只会在尝试了一切以避免首先需要多个进程之后才这样做。当我直接使用库时,为其他人提供一个共享库和控制台包装器将是一个更容易的选择。