遇到一个关于监视程序启动的问题,和以往大家问的颇感不同,困惑多日,不解,望高人出手,解决了高分重谢

linuxyf 2005-07-14 04:14:03
有这样一个程序,代码如下:
using System;

namespace Test1

{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
private string aa;
private string bb;


public string GetAA()
{
return aa;
}
public string SetAA(string a)
{
aa = a;
}


public string GetBB()
{
return bb;
}
public string SetBB(string b)
{
bb = b;
}

[STAThread]
static void Main(string[] args)
{
// 1. 处理相关操作
// ......................................
// 处理一些其它的操作,处理时间长度不确定
// ......................................

// 2. 处理相关操作
// ......................................
// 处理一些其它的操作,处理时间长度不确定
// ......................................

}
}
}

这个程序编译后,输出 Test1.exe, 要运行Test1.exe,需传入两个参数aa和bb。
现在我要在另一个控制台程序Test2.exe中对Test1.exe进行调用,传入两个参数。
要求是:

1、调用时要看Test1.exe的实例是否已经存在,如果不存在,启动一个Test1.exe实例,接受两个传入参数运行。

2、调用时,如果已经有Test1实例已经存在,
如果存在,则看本次调用时传入的第一个参数aa和已经运行的实例中的参数aa是否相同(不考虑第二个参数bb),如果相同,则用存在的实例接受本次传入的两个参数运行。
如果不存在,则再创建一个新Test1实例,接受两个传入参数进行运行。


这样的问题如何解决? 大家给点思路,谢谢
...全文
1058 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我认为最好使用Windows服务,你把你的Test1这个程序写成服务,就可以了。
随时调用,你说的这个问题用它通过多线程非常容易解决。
bsdboy 2005-07-16
  • 打赏
  • 举报
回复
用Socket是最容易解决的,不用去使用API。
test1
运行后打开一个端口监听
test2
运行后连接监听端口,超时说明test1没有运行
如果运行则通过Socket通信查询运行参数
相同则不做操作,不通则重新设置运行参数
当然API也可以实现,不过用托管代码调用非托管API总是不好的。

如果搞不定告诉我,帮你搞定。
linuxyf 2005-07-15
  • 打赏
  • 举报
回复
不好意思,你给的那个链接中已经有了这个问题了,谢谢,思归兄
linuxyf 2005-07-15
  • 打赏
  • 举报
回复
思归兄,请教一下,

假如我运行Test1.exe aaa bbb
得到进程当前进程pp,为何此时输出pp.StartInfo.Arguments的值为空,
而不是aaa bbb呢?
saucer 2005-07-15
  • 打赏
  • 举报
回复
>>>则用存在的实例接受本次传入的两个参数运行

想获得进程参数,你需要使用WMI或Win32API, 参考这个FAQ里的第5个问题

http://msdn.microsoft.com/netframework/programming/bcl/faq/SystemDiagnosticsProcessFAQ.aspx

一个进程已经开始,你想怎么“用存在的实例接受本次传入的两个参数运行”?杀了该进程重新开始?

感觉你没说清楚需求,也许你真正需要的是一个服务,你可以通过客户端来调用
HowcanIdo 2005-07-15
  • 打赏
  • 举报
回复
如果存在,则看本次调用时传入的第一个参数aa和已经运行的实例中的参数aa是否相同(不考虑第二个参数bb),如果相同,则用存在的实例接受本次传入的两个参数运行。
==================================================
太有难度了吧,你要取到内存中的变量值噢,不能想别的办法?
譬如test1.exe如果存在就写配置文件,注册表,数据库之内的,
然后test2.exe取读这些相关的东西不就行了?
linuxyf 2005-07-15
  • 打赏
  • 举报
回复
有没有人能给出一点儿建设性的意见啊? 星级高手怎么都潜水了?
JasonHeung 2005-07-15
  • 打赏
  • 举报
回复
test1.exe写一个自动断线连接指定ip的模块。这样随时可以用另一个程序监控其运行。
duan17 2005-07-15
  • 打赏
  • 举报
回复
把已经运行的实例的参数存储在文件中
如果参数相同就kill原来的,传入新参数重新运行,并把新参数写入文件中,以便下次进行比较
zhoucan2005 2005-07-15
  • 打赏
  • 举报
回复
用socket通信来解决
PhilexPei 2005-07-15
  • 打赏
  • 举报
回复
你最好做一个代理启动test1的程序来启动test1
PhilexPei 2005-07-15
  • 打赏
  • 举报
回复
试想一下如果这个时候有第三个程序准备运行会发生什么情况。
所以如果只有小于等于两个程序倒是比较简单,如果超过两个最好还是改一下设计思路吧。
bear123456789 2005-07-15
  • 打赏
  • 举报
回复
没有错!就是单子模式!只是要改进一下!建立个哈希表!把你的那些参数存起来!用于查找找到后不创建!没有找到就创建!这个就不能用STATIC来实现了!
linuxyf 2005-07-15
  • 打赏
  • 举报
回复
LeeCamus(李斌) ,你好,你可能没有看清我的要求,我不是单纯的要求一个单例,如果是这样的话,我早就实现了.
Camus_Li 2005-07-15
  • 打赏
  • 举报
回复
using System;

namespace LeeCamus.Win32

{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
private string aa;
private string bb;

private Class1(){}

private static Class1 class1=new Class1();
public static Class1 GetHandle
{
get
{
return class1;
}
}
public string AA
{
get
{
return aa;
}
set
{
aa=value;
}
}


public string BB
{
get
{
return bb;
}
set
{
bb=value;
}
}
}
}

这样,你的Class1实例就是唯一的了。
Camus_Li 2005-07-15
  • 打赏
  • 举报
回复
用Singleton(单子)设计模式设计Class1就可以啊。
zeusvenus 2005-07-14
  • 打赏
  • 举报
回复
把Test1抽象成业务组件!
linuxyf 2005-07-14
  • 打赏
  • 举报
回复
wh8254(为了俺老婆,努力写程序) ,这样可以调用一个exe程序,后面可以带参数
Process.Start(execProgramName,parameterName);
wh8254 2005-07-14
  • 打赏
  • 举报
回复
要调用.exe??
如果调用??
youwanna 2005-07-14
  • 打赏
  • 举报
回复
你这个问题应该去查进程间通信的资料吧
我帮你顶一下。。。
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧