日期:2014-05-18  浏览次数:20849 次

今日试验研究证明:时钟控件执行事件在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里面的用消息队列的。