回 帖 发 新 帖 刷新版面

主题:有关事件处理的问题

设计一个程序,使用Timer类的Elapsed事件,每1秒产生一个Elapsed事件,在事件处理方法里判断目前时间的秒数,若为偶数则显示“E”,若为奇数则显示“.”。在主方法Main()里判断目前的时间秒数,若为0则激活Elapsed事件,若为30则停止Elapsed事件。如此每隔30秒激活一次,每隔30秒停止一次。

下面是我写的部分程序,只是不知道主方法Main()该怎么样实现,望大家多多指点。

using System;
using System.Timers;

public class MsgSender
{
    public delegate void MsgArrivedHandler(string msg);
    public event MsgArrivedHandler msgArrivedEvent;
    private Timer timer;
    private int count;
    public MsgSender()
    {
        count=0;
        timer=new Timer(1000);
        ElapsedEventHandler eeh=new ElapsedEventHandler(checkMsg);
        timer.Elapsed+=eeh;
    }
    public void start()    {    timer.Start();    }
    public void stop() {    timer.Stop();    }
    private void checkMsg(object source, ElapsedEventArgs e)
    {
        if(count%2==0)
        {
            msgArrivedEvent("E");
        }
        else
            msgArrivedEvent(".");
        count++;
    }
}

public class MsgReceiver
{
    public MsgReceiver(MsgSender msgSender)
    {
        MsgSender.MsgArrivedHandler msh=new MsgSender.MsgArrivedHandler(msgText);
        msgSender.msgArrivedEvent+=msh;
    }
    private void msgText(string msg)
    {
        Console.Write("{0}", msg);
    }
}



class MsgTest
{    
    static void Main()
    {
         //主要是不知道这个函数的写法。
    }
}

回复列表 (共11个回复)

沙发

对外开放count字段等方法可以简化此过程。

另外,MsgSender类的checkMsg设计上出现死循环:checkMsg在msgArrivedEvent触发时被调用,然后它又再次触发msgArrivedEvent,由此导致死循环。

板凳

[quote]对外开放count字段等方法可以简化此过程。

另外,MsgSender类的checkMsg设计上出现死循环:checkMsg在msgArrivedEvent触发时被调用,然后它又再次触发msgArrivedEvent,由此导致死循环。[/quote]

checkMsg是在Elapsed事件触发时被调用,好像不存在死循环呀?????

3 楼

看得太快,当成一个类了,不好意思。


开放count字段,然后在Main中通过检查count即可。

4 楼

请教一楼上` 怎么引发Elapsed事件 能写全吗?

5 楼

[quote]请教一楼上` 怎么引发Elapsed事件 能写全吗?[/quote]
using System;
using System.Timer; 
public class OneHandler
{
    static void Main()
    {
          Timer timer=new Timer(1000);
          ElapsedEventHandler eeh=new ElapsedEventHandler(checkMsg);
          timer.Elapsed+=eeh;
          timer.Start();
          Console.ReadLine();
    }
    static void checkMsg(object s, ElapsedEventArgs e)
    {
          Console.WriteLine("Start");
    }
}

6 楼

还有帮忙的吗??

7 楼

using System;
using System.Timers;

namespace ConsoleApplication1
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    /// 
    public class MsgSender
    {
        public delegate void MsgArrivedHandler(string msg);
        public event MsgArrivedHandler msgArrivedEvent;
        public Timer timer;
        public int count;
        public MsgSender()
        {
            count=0;
            timer=new Timer(1000);
            
            //ElapsedEventHandler eeh=new ElapsedEventHandler(checkMsg);
            timer.Start(); 
            timer.Elapsed+=new ElapsedEventHandler(checkMsg);
            this.msgArrivedEvent +=new MsgArrivedHandler(msgText);
            
            
            Console.ReadLine();
        }
        //public void start()    {    timer.Start();    }
        public void stop() {    timer.Stop();    }
        public void checkMsg(object source, ElapsedEventArgs e)
        {
            if(count%2==0)
            {
                msgArrivedEvent("E");
                //this.msgArrivedEvent +=new MsgArrivedHandler(msgText);
                count++;
            }
            else
            {
                msgArrivedEvent(".");
                //this.msgArrivedEvent +=new MsgArrivedHandler(msgText);
                count++;
            }

            if(this.count == 30)
            {
                this.stop();
            }
                
        }

        public void msgText(string msg)
        {
            Console.Write("{0}", msg);
        }
        
    }

    public class MsgReceiver
    {
        public MsgReceiver(MsgSender msgSender)
        {
            MsgSender.MsgArrivedHandler msh=new MsgSender.MsgArrivedHandler(msgText);
            msgSender.msgArrivedEvent+=msh;
        }
        public void msgText(string msg)
        {
            Console.Write("{0}", msg);
        }
    }

    class MsgTest
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        /// 
        

        [STAThread]
        static void Main(string[] args)
        {
        
             new MsgSender();
            //MsgReceiver b = new MsgReceiver(a);
            
            
        }
    }


}
明白了,只要调用timer.Start();就可以启动,   我修改了一下, 比较乱   可以运行

8 楼

to 七楼:

你的程序好像只能启动和停止一次,不能做到每隔30秒激活和停止。

9 楼

对啊,`  你自己改改嘛

10 楼


private System.Windows.Forms.Timer timer2;

private void timer2_Tick(object sender, System.EventArgs e)
        {
            this.label2.Text=DateTime.Now.ToString();
            bool flag=true;
            //bool temp=true;
            try
            {
                    if(DateTime.Now.Second==0){this.star();}
                    
                if(DateTime.Now.Second==30){this.stop();}
                    
            }
            catch(System.Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

static void Main(string[] args)
        {
        
             new MsgSender();
                        
        }

我来回复

您尚未登录,请登录后再回复。点此登录或注册