屏幕有一个表示时间间隔的变量Frtime,读取数据库中的一个值。
以这个值为时间间隔刷新屏幕。
当别的程序修改了这个值,就会向屏幕发送消息(不带任何内容,只是消息)。
屏幕收到消息后重新从数据库读取这个值。一开始用的是System.Windows.Forms.Timer,后来发现只是单线程的,这种情况不行。想用System.Threading.Timer,
TimerCallback tmrCallBack = new TimerCallback(fun2);
中告诉我fun2的重载均与委托System.Threading.TimerCallback不匹配……
也不知道
System.Threading.Timer tmr = new System.Threading.Timer(tmrCallBack, null, TimeSpan.Zero, TimeSpan.FromSeconds(2));
实例化时是否允许有变量……不知道TimeSpan行不行……各种不了解……
所以请教下论坛的各路英雄,有什么好的方法,最好给下简单的代码……
以这个值为时间间隔刷新屏幕。
当别的程序修改了这个值,就会向屏幕发送消息(不带任何内容,只是消息)。
屏幕收到消息后重新从数据库读取这个值。一开始用的是System.Windows.Forms.Timer,后来发现只是单线程的,这种情况不行。想用System.Threading.Timer,
TimerCallback tmrCallBack = new TimerCallback(fun2);
中告诉我fun2的重载均与委托System.Threading.TimerCallback不匹配……
也不知道
System.Threading.Timer tmr = new System.Threading.Timer(tmrCallBack, null, TimeSpan.Zero, TimeSpan.FromSeconds(2));
实例化时是否允许有变量……不知道TimeSpan行不行……各种不了解……
所以请教下论坛的各路英雄,有什么好的方法,最好给下简单的代码……
你在事件中调用fun2
试过,明明timer.Interval已经变了,可是按照原先时间间隔走= =
public void Cal()
{
while(true)
{
int val = getvalfromdb();
arv.WaitOne(val * 1000);
//显示
}
}
如果想要有退出控制的话。 true用一个bool变量代替。
System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
public void display()
{
while (flag)
{
are.WaitOne(1000);
Console.WriteLine("display " + DateTime.Now.ToString());
}
} public void StartDisplay()
{
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(display));
th.Start();
} public void Stopdisplay()
{
flag = false;
are.Set();
}
不过我的屏幕显示程序中没有新建过Thread。由于别的程序给我的屏幕发信息,即另一个线程,所以我用委托的方式使用一些方法。这个Cal,或者9楼的display()可以用委托的方式调用么?
但是有一点,当程序关闭时,线程th怎么释放呢?在编译器里,虽然用ALT+F4关闭了窗口,可是依然处于调试状态(平时不这样)……
之所以放在侦听函数中,是出于这样的情况:
有一个负责显示内容的主函数A,现在A中调用StartDisplay()
在构造函数中调用A,即屏幕一开始有一个显示的状态。
侦听函数T负责接收消息,一旦接收到了消息,就用委托方式调用A刷新,我目前在调用A之前先调用Stopdisplay();
而且StartDisplay()中我增加了一句flag = true;使flag随时变化。以便于这两个方法随时成功调用。
总之,谢谢您提供的方法,我也是第一次听说AutoResetEvent,之前只想着Timer了……