读书人

问大神们两个有关问题一个是如何判断

发布时间: 2013-11-09 17:06:34 作者: rapoo

问大神们两个问题,一个是怎么判断线程定时器有没有刷新的问题,一个是事件执行的问题
问各位大神们两个问题:
问题前提:我要做个和每个检测站联网的程序,我使用的是多线程,一个检测站一个线程,每个检测站就是在label里面刷新数据,10s刷新一次。需要做的是让每个检测站相互独立,一个检测数据卡掉不会影响其他的检测站,一个检测站数据3分钟没有刷新就重启这个线程,如图问大神们两个有关问题,一个是如何判断线程定时器有没有刷新的有关问题,一个是事件执行的有关问题
第一个问题是:
我现在写了个监控程序(在别人帮助下),只是判断了超过三分钟,但是没有判断三分钟是否刷新线程,所以想问大神们怎么判断我这个线程三分钟是否刷新了,每个线程里面都有一个timer定时器,10s刷新一次。
代码如下:
定义:


Dictionary<int, DateTime> source = new Dictionary<int, DateTime>();
private TimerCallback ti;


FORM的load程序

private void frmMain_Load(object sender, EventArgs e)
{
EQ2008Config.GetSection();
string strpath = AppDomain.CurrentDomain.BaseDirectory + "\\StationConfig.xml";
XmlDocument doc = new XmlDocument();//初始化一个xml实例
doc.Load(strpath);//导入指定的xml文件
XmlNode no = doc.SelectSingleNode("StationList");//指定一个节点
XmlNodeList listnode = no.SelectNodes("StationData");//获取同名同级别"stationdata"节点集合

ti = new TimerCallback(ShowDataToScreenStation);
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

foreach (XmlNode node in listnode)//遍历所有的stationdata节点
{
weituo = new WeiTuo<XmlNode>(Set_labelText);
StartThread(node);
}
//下面是监控程序
Thread jiankong = new Thread(()=>{
while (true)
{
foreach(var item in source)
{
if((DateTime.Now - item.Value)>TimeSpan.FromSeconds(180))//判断超出三分钟怎么判断计时器是否刷新呢????
{
if (sf_event != null)
this.sf_event(item.Key);
}
}
Thread.Sleep(5000);//监控线程5秒执行一次
}
});
jiankong.IsBackground = true;
jiankong.Start();
}


生成label的函数,里面有定时器,10s刷新一次数据

public void Set_labelText(XmlNode strText)
{
this.Invoke((Action<XmlNode>)delegate(XmlNode node)
{
StationData stationData = new StationData(node);
source.Add(stationData.CardFlagID, DateTime.Now);
//stationData.IsShow = false;
Program.listStationList.Add(stationData);
this.flowLayoutPanel1.BackColor = Color.Orange;


Label lab = new Label();//实例一个label显示

lab.Name = "lab" + stationData.CardFlagID.ToString();
lab.AutoSize = false;
lab.Size = new Size(280, 140);
lab.BorderStyle = BorderStyle.Fixed3D;
lab.Text = stationData.StatinName;
lab.Font = new Font("宋体", 11);

if (stationData.IsShow)
{
lab.BackColor = Color.Green;
}
if (stationData.IsShow)
{
System.Threading.Timer tim = new System.Threading.Timer(ti, stationData.CardFlagID, 0, 10000);
//超过0秒后,以及此后每隔10秒间隔,都会调用一次由TimerCallback(ShowDataToScreenStation)指定的委托。
//每隔10秒,刷新一次检测站数据
dicThread.Add(stationData.CardFlagID.ToString(), tim);
}
this.flowLayoutPanel1.Controls.Add(lab);
}, strText);
}



下面是创建线程的函数

void StartThread(XmlNode x)
{
Thread a = new Thread(() =>{
Set_labelText(x);
});
a.IsBackground = true;
a.Start();
this.sf_event += (ids) => {
a.Abort();
a = new Thread(() =>
{
Set_labelText(x);
});
a.IsBackground = true;
a.Start();
};//注册事件
}



先问第一个问题吧!拜托谢谢各位大神们! Timer 多线程 刷新 监控
[解决办法]
弱弱的问一下给我分么
[解决办法]
定义一个委托,在主线程和子线程中做定义,子线程刷新以后,就调用这个委托函数就知道了
[解决办法]
刚刚看了一下,你可用分10
给我了是不是你就负的了,还是根本给不了我呢
[解决办法]
引用:
Quote: 引用:

弱弱的问一下给我分么
看在你是Neusoft,我也得给!!!


别介 还是看我人品吧
[解决办法]
我06年毕业的

读书人网 >C#

热点推荐