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

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行不行……

各种不了解……
所以请教下论坛的各路英雄,有什么好的方法,最好给下简单的代码……
...全文
187 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
  • 打赏
  • 举报
回复
有没有比较好的方法什么?
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

111,132

社区成员

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

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

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