当然,可能有这样一个解释(这里p3延时为300毫秒):
当p3结束p1时,p2据上次延时已超过4700毫秒,所以它能赶在300毫秒(到时它本身会被结束)之内启动p1
但如果是这样,p3不能结束p1,p2的概率只有6%(300/5000)
------------------------------------------
一看就有問題,實在不知道這6%是怎么計算的.
依LZ的邏輯,如果p3是延時5000秒,p3不能结束p1,p2的概率難道就是100%(5000/5000)了???
当p3结束p1时,p2据上次延时已超过4700毫秒,所以它能赶在300毫秒(到时它本身会被结束)之内启动p1
但如果是这样,p3不能结束p1,p2的概率只有6%(300/5000)
------------------------------------------
一看就有問題,實在不知道這6%是怎么計算的.
依LZ的邏輯,如果p3是延時5000秒,p3不能结束p1,p2的概率難道就是100%(5000/5000)了???
怎么解决这个问题呢?
============================================================================
可以考虑用异步(新开线程)的方式来处理
p3如果延时过长,p2有足够的时间来启动p1,之后p2虽然会被结束,但那时p1会启动它,当然是100%不可能结束p1,p2了
private void Form1_Load(object sender, EventArgs e)
{
while (true)
{
System.Threading.Thread.Sleep(5000);
while (Process.GetProcessesByName( "p1 ").Length > 0) Tread.Sleep(1); Process.Start( "p1 ");
}
}结果:
例1:近乎100%成功
KILL一个进程在我的机器上需要 15ms - 16ms 的时间
启动一个进程在我的机器上需要 31ms - 78ms 的时间因此,在在KILL一个进程后,p3有 > 15ms的时间去KILL另一个例2:近乎100%不成功按照上面的例子,只要KILL的快,就可以成功,但为什么这里不成功了呢?
原因就在LZ的代码逻辑
假如启动p1 10s之后,p3的SLEEP时间设为 300
(5s后,p2被启动)1.此时p1,p2都在判断对方是否正常,
2.KIll p1
3.1 p2不需要等待启动p1,然后进入5000的sleep
3.2 p3进入等待300
4. 300 后,kill p2
5. 5000-300后 p1启动p2其它情况就先不分析了。
下面是我的回复:
1.加不加小睡结果都是一样的
2.启动或结束一个进程只需数十毫秒,相对于sleep的数百数千毫秒微不足道,完全可以忽略
3.5000-300后,p1启动p2?这是不可能的,因为p1早就被kill了另外,我通过加一些标记,发现顺序是:
p3结束p1
p2启动p1
p3结束p2
p1启动p2
这就怪了,p3只睡眠了300毫秒,p2则睡眠了0--5000毫秒(平均也有2500毫秒),它怎么能赶在自身被结束之前就去启动p1呢(要知道,发生这种情况的概率只有6%,但测试结果表明,近乎100%的情况下,它都能这样)不可思议
所以,(5000-300)时间后,当p2被Kill时,p1又把p2启动。
C#的工程原代码和具体内容可以在以下连接看到。
http://blog.csdn.net/kangkanglx/archive/2010/06/25/5692984.aspx