问大神们两个问题,一个是怎么判断线程定时器有没有刷新的问题,一个是事件执行的问题

时间:2022-06-24 02:30:06
问各位大神们两个问题:
问题前提:我要做个和每个检测站联网的程序,我使用的是多线程,一个检测站一个线程,每个检测站就是在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();
            };//注册事件
        }



先问第一个问题吧!拜托谢谢各位大神们!

17 个解决方案

#1


this.sf_event += (ids) => {
                a.Abort();
在事件里多设一个参数,记录3分钟内是否调用回掉函数了-也就是你说刷新了?
50分 争取一下下

#2


引用 1 楼 neusoft06 的回复:
this.sf_event += (ids) => {
                a.Abort();
在事件里多设一个参数,记录3分钟内是否调用回掉函数了-也就是你说刷新了?
50分 争取一下下
绝对会调用的,10s调用一次,其实我就是在判断刷新上卡死,都不知道发了多少贴了,我现在打算用判断刷新函数是否执行完毕来判断,就是你刚才在另一个帖子回答我的问题!

#3


弱弱的问一下给我分么

#4


定义一个委托,在主线程和子线程中做定义,子线程刷新以后,就调用这个委托函数就知道了

#5


引用 3 楼 neusoft06 的回复:
弱弱的问一下给我分么
看在你是Neusoft,我也得给!!!

#6


刚刚看了一下,你可用分10
给我了是不是你就负的了,还是根本给不了我呢

#7


引用 5 楼 u012238529 的回复:
Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧

#8


引用 4 楼 mjp1234airen4385 的回复:
定义一个委托,在主线程和子线程中做定义,子线程刷新以后,就调用这个委托函数就知道了
大师,麻烦你看我的另一个帖子,http://bbs.csdn.net/topics/390634209?page=1#post-396006280,谢谢啦!

#9


引用 7 楼 neusoft06 的回复:
Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?

#10


引用 6 楼 neusoft06 的回复:
刚刚看了一下,你可用分10
给我了是不是你就负的了,还是根本给不了我呢
我的分都压在帖子上了,可用分当然没了,这几天发的全是关于多线程的帖子! 问大神们两个问题,一个是怎么判断线程定时器有没有刷新的问题,一个是事件执行的问题

#11


写个全局变量,进入就加1

#12


引用 11 楼 u011223070 的回复:
写个全局变量,进入就加1

我现在改变方法了,是判断刷新函数没有执行完的次数,超过5次就重启,不过我的是多线程,判断为完成的执行次数这里总是出错,因为多线程都是依次调用的同一个刷新函数!就在这里卡死了!

#13


引用 9 楼 u012238529 的回复:
Quote: 引用 7 楼 neusoft06 的回复:

Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?


缘分呀

我也在做多线程的项目 
感觉要学的东西还挺多的

#14


引用 13 楼 neusoft06 的回复:
Quote: 引用 9 楼 u012238529 的回复:

Quote: 引用 7 楼 neusoft06 的回复:

Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?


缘分呀

我也在做多线程的项目 
感觉要学的东西还挺多的

我以前在Neusoft是做C的,刚接触c#就做多线程!感觉做不出来!

#15


我06年毕业的

#16


我06年毕业的

#17


我06年毕业的

#1


this.sf_event += (ids) => {
                a.Abort();
在事件里多设一个参数,记录3分钟内是否调用回掉函数了-也就是你说刷新了?
50分 争取一下下

#2


引用 1 楼 neusoft06 的回复:
this.sf_event += (ids) => {
                a.Abort();
在事件里多设一个参数,记录3分钟内是否调用回掉函数了-也就是你说刷新了?
50分 争取一下下
绝对会调用的,10s调用一次,其实我就是在判断刷新上卡死,都不知道发了多少贴了,我现在打算用判断刷新函数是否执行完毕来判断,就是你刚才在另一个帖子回答我的问题!

#3


弱弱的问一下给我分么

#4


定义一个委托,在主线程和子线程中做定义,子线程刷新以后,就调用这个委托函数就知道了

#5


引用 3 楼 neusoft06 的回复:
弱弱的问一下给我分么
看在你是Neusoft,我也得给!!!

#6


刚刚看了一下,你可用分10
给我了是不是你就负的了,还是根本给不了我呢

#7


引用 5 楼 u012238529 的回复:
Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧

#8


引用 4 楼 mjp1234airen4385 的回复:
定义一个委托,在主线程和子线程中做定义,子线程刷新以后,就调用这个委托函数就知道了
大师,麻烦你看我的另一个帖子,http://bbs.csdn.net/topics/390634209?page=1#post-396006280,谢谢啦!

#9


引用 7 楼 neusoft06 的回复:
Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?

#10


引用 6 楼 neusoft06 的回复:
刚刚看了一下,你可用分10
给我了是不是你就负的了,还是根本给不了我呢
我的分都压在帖子上了,可用分当然没了,这几天发的全是关于多线程的帖子! 问大神们两个问题,一个是怎么判断线程定时器有没有刷新的问题,一个是事件执行的问题

#11


写个全局变量,进入就加1

#12


引用 11 楼 u011223070 的回复:
写个全局变量,进入就加1

我现在改变方法了,是判断刷新函数没有执行完的次数,超过5次就重启,不过我的是多线程,判断为完成的执行次数这里总是出错,因为多线程都是依次调用的同一个刷新函数!就在这里卡死了!

#13


引用 9 楼 u012238529 的回复:
Quote: 引用 7 楼 neusoft06 的回复:

Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?


缘分呀

我也在做多线程的项目 
感觉要学的东西还挺多的

#14


引用 13 楼 neusoft06 的回复:
Quote: 引用 9 楼 u012238529 的回复:

Quote: 引用 7 楼 neusoft06 的回复:

Quote: 引用 5 楼 u012238529 的回复:

Quote: 引用 3 楼 neusoft06 的回复:

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


别介 还是看我人品吧
谁让我以前也是Neusoft呢?


缘分呀

我也在做多线程的项目 
感觉要学的东西还挺多的

我以前在Neusoft是做C的,刚接触c#就做多线程!感觉做不出来!

#15


我06年毕业的

#16


我06年毕业的

#17


我06年毕业的