主题:有关事件处理的问题
szh
[专家分:380] 发布于 2006-05-02 16:26:00
设计一个程序,使用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个回复)
沙发
jzyray [专家分:20610] 发布于 2006-05-02 19:16:00
对外开放count字段等方法可以简化此过程。
另外,MsgSender类的checkMsg设计上出现死循环:checkMsg在msgArrivedEvent触发时被调用,然后它又再次触发msgArrivedEvent,由此导致死循环。
板凳
szh [专家分:380] 发布于 2006-05-02 20:08:00
[quote]对外开放count字段等方法可以简化此过程。
另外,MsgSender类的checkMsg设计上出现死循环:checkMsg在msgArrivedEvent触发时被调用,然后它又再次触发msgArrivedEvent,由此导致死循环。[/quote]
checkMsg是在Elapsed事件触发时被调用,好像不存在死循环呀?????
3 楼
jzyray [专家分:20610] 发布于 2006-05-02 21:31:00
看得太快,当成一个类了,不好意思。
开放count字段,然后在Main中通过检查count即可。
4 楼
wbyoulove [专家分:4830] 发布于 2006-05-02 22:22:00
请教一楼上` 怎么引发Elapsed事件 能写全吗?
5 楼
szh [专家分:380] 发布于 2006-05-03 09:36:00
[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 楼
szh [专家分:380] 发布于 2006-05-03 17:06:00
还有帮忙的吗??
7 楼
wbyoulove [专家分:4830] 发布于 2006-05-03 23:12:00
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 楼
szh [专家分:380] 发布于 2006-05-04 07:54:00
to 七楼:
你的程序好像只能启动和停止一次,不能做到每隔30秒激活和停止。
9 楼
wbyoulove [专家分:4830] 发布于 2006-05-04 21:28:00
对啊,` 你自己改改嘛
10 楼
linjianyu52 [专家分:10] 发布于 2006-05-08 21:08:00
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();
}
我来回复