今日试验研究证明:时钟控件执行事件在Mutex互斥情况下不受影响!欢迎进来讨论。
今日做了一个简单试验,用互斥类Mutex作进程间的互斥,先建立一个窗体级别的互斥类My_mutex,
其中有几个按纽
private void button1_Click(object sender, EventArgs e)
{
My_mutex.WaitOne();
}
private void button2_Click(object sender, EventArgs e)
{
this.timer1.Enabled=true;
}
private void button3_Click(object sender, EventArgs e)
{
try
{
My_mutex.ReleaseMutex();
}catch{}
}
即进入互斥状态,
之后在一个1秒钟执行一次的时钟timer1_Tick执行事件如下:
private void timer1_Tick(object sender, EventArgs e)
{
bool TemResult=false;
TemResult=My_mutex.WaitOne(5000, false);
if(TemResult==false)
{
//MessageBox.Show( "等待已经超时了!! ");
this.timer1.Enabled=false;
}else
{
this.listBox1.Items.Add( "你好 ");
}
try
{
My_mutex.ReleaseMutex();
}catch{}
}
以上大概是令每次时钟执行一次就进行一个互斥操作,超时时间为5秒钟,
于是我运行了该程序的两个实例,先在第一实例窗口中按了一下button1即
进行无限等待的互斥操作My_mutex.WaitOne(); 之后在第二实例窗口中按了
一下button2,即 令时钟进入计时状态,之后查看结果:
1、如果什么也不做之后在5秒钟后,时钟停止,没有任何信息加入列表listBox1,
2、如果在5秒的互斥超时等待时间之内按一下实例1窗口的button3,即释放上一个互斥,
这样实例2理科就会有n个信息加入列表,
n=时钟执行次数,如此可以得结论就是,在互斥期间,时钟事件还是会被触发,并
不象我期待那样以为凡是有互斥等待,时钟也会被冻结,但事实上是时钟
不受互斥对象等待超时的影响,如果互斥对象在超时事件内得到进入,期间的时钟
事件代码也会全部执行,当然互斥对象等待超时,代码不会执行。
3、我认为C#的时钟组件还是用了消息队列来工作。
以上是试验的结果,欢迎拍砖!
------解决方案--------------------没人告诉你Mutex是跨进程的。你要快进程那么需要命名的Mutex
------解决方案--------------------My_mutex.WaitOne(5000, false);
这一句是个废话,根本不会等待5秒钟,同一个线程内的互斥体即使重复获取也不会阻塞!
C#的计时器有三种,一个是forms名称空间的,另外一个是threading里面的,还有一个timer名称空间的,不一样的。forms里面的用消息队列的。