根据可变化的时间间隔刷新屏幕

ProsperLee 2011-11-16 11:33:49
屏幕有一个表示时间间隔的变量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行不行……

各种不了解……
所以请教下论坛的各路英雄,有什么好的方法,最好给下简单的代码……
...全文
131 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ajaxtop 的回复:]
应该用timer的事件,不是用上面的call啥啥啥
你在事件中调用fun2
[/Quote]

试过,明明timer.Interval已经变了,可是按照原先时间间隔走= =
ajaxtop 2011-11-16
  • 打赏
  • 举报
回复
应该用timer的事件,不是用上面的call啥啥啥
你在事件中调用fun2
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
timer不是线程,搞清楚
[/Quote]
我知道是控件,但是System.Windows.Forms.Timer只是单线程控件,别的线程请求改变时间间隔的时候是没有变化的。
bdmh 2011-11-16
  • 打赏
  • 举报
回复
timer不是线程,搞清楚
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mabaolin 的回复:]
关闭前调用stopdisplay
[/Quote]
应该是Stopdisplay();放在什么地方的问题,我原先放在Form1_FormClosing中依然不管用,放在信息的侦听函数T中就可以了……
之所以放在侦听函数中,是出于这样的情况:
有一个负责显示内容的主函数A,现在A中调用StartDisplay()
在构造函数中调用A,即屏幕一开始有一个显示的状态。
侦听函数T负责接收消息,一旦接收到了消息,就用委托方式调用A刷新,我目前在调用A之前先调用Stopdisplay();
而且StartDisplay()中我增加了一句flag = true;使flag随时变化。以便于这两个方法随时成功调用。
总之,谢谢您提供的方法,我也是第一次听说AutoResetEvent,之前只想着Timer了……
mabaolin 2011-11-16
  • 打赏
  • 举报
回复
关闭前调用stopdisplay
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mabaolin 的回复:]
volatile bool flag = true;
System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
public void display()
{
while (flag)
{……
[/Quote]
用这个方法成功了!
但是有一点,当程序关闭时,线程th怎么释放呢?在编译器里,虽然用ALT+F4关闭了窗口,可是依然处于调试状态(平时不这样)……
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mabaolin 的回复:]
volatile bool flag = true;
System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
public void display()
{
while (flag)
{……
[/Quote]
明白了。
不过我的屏幕显示程序中没有新建过Thread。由于别的程序给我的屏幕发信息,即另一个线程,所以我用委托的方式使用一些方法。这个Cal,或者9楼的display()可以用委托的方式调用么?
mabaolin 2011-11-16
  • 打赏
  • 举报
回复
volatile bool flag = true;
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();
}
mabaolin 2011-11-16
  • 打赏
  • 举报
回复
while(true)//一直循环。 只要外边通过threadpool启动新线程调用cal就行。
如果想要有退出控制的话。 true用一个bool变量代替。
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mabaolin 的回复:]
AutoResetEvent arv = new AutoResetEvent(false);
public void Cal()
{
while(true)
{
int val = getvalfromdb();
arv.WaitOne(val * 1000);
//显示
}
}
[/Quote]
谢谢提供思路,问下,设置完arv.set();之后,如何调用Cal();呢?
mabaolin 2011-11-16
  • 打赏
  • 举报
回复
AutoResetEvent arv = new AutoResetEvent(false);
public void Cal()
{
while(true)
{
int val = getvalfromdb();
arv.WaitOne(val * 1000);
//显示
}
}
ProsperLee 2011-11-16
  • 打赏
  • 举报
回复
有没有比较好的方法什么?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧