当前位置:编程学习 > C#/ASP.NET >>

怎么判断一个函数是否执行完毕并且记录此函数没有执行完的次数?

怎么判断一个函数是否执行完毕并且记录此函数没有执行完的次数?并且将此函数没有执行完毕的次数记录到字典。
注:此函数每10s便会被调用一次! 刷新 函数 --------------------编程问答-------------------- 这……。声明两个int 并初始化0,一个用来计算调用次数(放在调用函数前,每次++),一个用来计算执行次数(放在函数里面,主代码后面),没有执行的次数不就是总数-执行数 --------------------编程问答-------------------- 这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390624556
这个跟你应该是一样的道理 --------------------编程问答--------------------
引用 2 楼 laiyongxin 的回复:
这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启! --------------------编程问答-------------------- 我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启! --------------------编程问答--------------------

 System.Threading.Timer tim = new System.Threading.Timer(ti, stationData.CardFlagID, 0, 10000);
//10s调用一次ti
 ti = new TimerCallback(ShowDataToScreenStation);
 private void ShowDataToScreenStation(object stationFlagID){……}
--------------------编程问答--------------------
引用 5 楼 u012238529 的回复:
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
那就设置成static就差不多了 --------------------编程问答--------------------
引用 7 楼 zhurcn 的回复:
Quote: 引用 5 楼 u012238529 的回复:

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
那就设置成static就差不多了

给个例子看看先,新手啊! --------------------编程问答-------------------- 楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!! --------------------编程问答-------------------- 提的问题本身有问题,线程没有执行完,立强行结束了吗? --------------------编程问答-------------------- stub1
you code
stub2 

deltas = before -after --------------------编程问答--------------------
引用 4 楼 u012238529 的回复:
Quote: 引用 2 楼 laiyongxin 的回复:

这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!

那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊 --------------------编程问答--------------------
引用 9 楼 jiaoshiyao 的回复:
楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!!

是10s执行一次,想判断ShowDataToScreenStation(object stationFlagID)这个函数是否执行完毕,这个函数是刷新数据用的,如果执行完毕了就说明刷新成功了,如果没有就说明刷新数据失败,但是不论数据刷新成功或者失败都会10s调一次这个函数!我就是想通过记录刷新失败的次数来作为监控线程的判断条件。 --------------------编程问答--------------------
引用 12 楼 laiyongxin 的回复:
Quote: 引用 4 楼 u012238529 的回复:

Quote: 引用 2 楼 laiyongxin 的回复:

这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!

那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊

但是我还想把每次记录放进字典里,因为有好几个线程,想把记录每个线程的次数放进字典里面,然后遍历! --------------------编程问答--------------------
引用 5 楼 u012238529 的回复:
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
觉得你的问题好简单,设置两个计数器就行了。。。
int count1 = 0;
int count2 = 0;//两个都是全局的
......
conut1++;
ShowDataToScreenStation(stationFlagID);
......
public void ShowDataToScreenStation(object stationFlagID)
{
    ......
    count2++;
}
--------------------编程问答--------------------
引用 15 楼 danding_ge 的回复:
Quote: 引用 5 楼 u012238529 的回复:

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
觉得你的问题好简单,设置两个计数器就行了。。。
int count1 = 0;
int count2 = 0;//两个都是全局的
......
conut1++;
ShowDataToScreenStation(stationFlagID);
......
public void ShowDataToScreenStation(object stationFlagID)
{
    ......
    count2++;
}
调用的此函数是timer的callback函数,10s一次,并且要把次数记录到字典 --------------------编程问答-------------------- 能把你的代码贴出来吗? --------------------编程问答--------------------
引用 17 楼 danding_ge 的回复:
能把你的代码贴出来吗?

好的,稍等! --------------------编程问答--------------------

Dictionary<int, int> source = new Dictionary<int, int>();//字典,打算将每个线程刷新失败的次数记录到里面
public static int i;
public static int j;
public static int num;

下面是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);
            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(item.Value>3)  //这是我刚写的,貌似不对,打算遍历字典,如果刷新失败次数大于3就关闭线程,也就是触发下面的事件
                       {
                           if (sf_event != null) 
                               this.sf_event(item.Key);
                           i = 0;
                           j = 0;
                       }
                   }
                   Thread.Sleep(5000);//监控线程5秒执行一次
               }
            });
            jiankong.IsBackground = true;
            jiankong.Start();
}


这是Set_labelText函数,主要就是生成label,10s一次的刷新数据

public void Set_labelText(XmlNode strText) 
        {
            this.Invoke((Action<XmlNode>)delegate(XmlNode node)
            {
                StationData stationData = new StationData(node);
                
                //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秒,刷新一次检测站数据
                    num = i - j;//我刚写的,貌似不对,--
                    dicThread.Add(stationData.CardFlagID.ToString(), tim);
                    source.Add(stationData.CardFlagID, num);//打算把次数记录到字典
                }
                this.flowLayoutPanel1.Controls.Add(lab);
            }, strText);
        }


下面是StartThread(node)函数,主要就是创建线程

 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();
            };//注册事件,线程的“重启”


下面是ti调用的callback函数,也就是刷新判断网络是否是通的,也就是主要在这里判断数据是否刷新成功

 private void ShowDataToScreenStation(object stationFlagID)
        {
            i++;
           // source[Convert.ToInt32(stationFlagID)] = DateTime.Now; //获取时间
            if (!IsStartUpdateData)
            {
                return;
            }
            StationData dataRow = Program.listStationList.Find(temp => temp.CardFlagID.ToString() == stationFlagID.ToString());
            try
            {

                if (dataRow.State > 0||!dataRow.IsShow)
                { return; }

                dataRow.State = 1;

                DateTime dtStart = DateTime.Now;
                if (!PingResult(dataRow.IP))
                {
                    this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "网络不通,无法显示!!!", false, true);//我现在是这种状态,一直走这个分支,这个分支不算刷新失败
                    return;
                }
                List<int> intdaijingList = new List<int>();
               // if (!dicProgralist.TryGetValue(dataRow.CardFlagID.ToString(), out intdaijingList))
                dataRow.IsSendHeadText = 1;
                if(dataRow.IsSendHeadText==0)
                {
                    
                    Invoke(new MethodInvoker(delegate()//执行委托,委托的返回值为空
                    {
                        try
                        {
                            EQ2008Class.User_DelAllProgram(dataRow.CardFlagID);
                        }
                        catch
                        {
                        }

                        int Protra = EQ2008Class.User_AddProgram(dataRow.CardFlagID, true, 1000000);

                        bool isTrue = ShowHeaderText(dataRow, Protra);
                        if (isTrue)
                        {
                            dicProgralist.Add(dataRow.CardFlagID.ToString(), new List<int>());
                            dicProgralist[dataRow.CardFlagID.ToString()].Add(Protra);
                            dataRow.IsSendHeadText = 1;
                        }
                    }));
                }

                if (dataRow.AJRows > 0 && !isAjUpdate)
                {
                    ShowAJShiShiDataToScreen(dataRow, 0, 0);
                }
                if (dataRow.HJRows > 0&& !isHjupdate)
                {
                    ShowAJShiShiDataToScreen(dataRow, 0, 1);
                }
                try
                {
                    Application.DoEvents();
                }
                catch
                {
                }
                //this.txtStatus.Text = "更新[" + dataRow.StatinName + "]数据结束;";
                DateTime dtEnd = DateTime.Now;
                TimeSpan sp = new TimeSpan(dtEnd.Ticks - dtStart.Ticks);
                this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "耗时:" + Convert.ToInt32(sp.TotalSeconds).ToString() + "秒", true, false);
                dataRow.State = 0;
            }
            catch
            {
                
            }
            finally
            {
                dataRow.State = 0;
            }
            
            j++;
            
        }
--------------------编程问答--------------------
引用 18 楼 u012238529 的回复:
Quote: 引用 17 楼 danding_ge 的回复:

能把你的代码贴出来吗?

好的,稍等!
代码已出!!! --------------------编程问答-------------------- 定义计数器变量就好了 --------------------编程问答--------------------
引用 21 楼 xiangma04 的回复:
定义计数器变量就好了

我上面做的也是定义了计数器变量,但是貌似有问题 --------------------编程问答-------------------- 每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。 --------------------编程问答--------------------
引用 23 楼 danding_ge 的回复:
每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。
不可以根据object stationFlagID作为key存进字典吗?遍历字典不可以吗 --------------------编程问答--------------------
引用 24 楼 u012238529 的回复:
Quote: 引用 23 楼 danding_ge 的回复:

每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。
不可以根据object stationFlagID作为key存进字典吗?遍历字典不可以吗
字典这东西我不太懂。。 --------------------编程问答--------------------
引用 9 楼 jiaoshiyao 的回复:
楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!!
其实还是原来问过你的问题,现在想通过记录次数来实现,不通过时间,麻烦你看下我的代码,是不是也可以用字典呢? --------------------编程问答--------------------
引用 26 楼 u012238529 的回复:

能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测 
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊 --------------------编程问答--------------------
引用 27 楼 jiaoshiyao 的回复:
Quote: 引用 26 楼 u012238529 的回复:

能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测 
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊

嗯,太谢谢你了,那个10s钟刷新弄出来了,现在就是弄这个问题了,刚接触编程,所以问的比较多! --------------------编程问答-------------------- Task mainTask = Task.Factory.StartNew(() =>
 {
}
用任务做是不是能满足你的需求呢 --------------------编程问答-------------------- 我的是多线程,貌似不能用这种方法 --------------------编程问答--------------------
引用 27 楼 jiaoshiyao 的回复:
Quote: 引用 26 楼 u012238529 的回复:

能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测 
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊

大师,不好意思又要请教你了,我的这种计数方法在多线程中是不是就无法使用啊? --------------------编程问答-------------------- 不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
--------------------编程问答--------------------
引用 12 楼 laiyongxin 的回复:
Quote: 引用 4 楼 u012238529 的回复:

Quote: 引用 2 楼 laiyongxin 的回复:

这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数

我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!

那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊

多线程都调用一个函数进行刷新,这样可以吗? --------------------编程问答--------------------
引用 32 楼 jiaoshiyao 的回复:
不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊? --------------------编程问答--------------------
引用 34 楼 u012238529 的回复:
Quote: 引用 32 楼 jiaoshiyao 的回复:

不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?

你的全局是flag_a 和flag_b怎么定义的 ?
不行的话 你把 flag_a和flag_b设置成静态变量 --------------------编程问答--------------------
引用 35 楼 laiyongxin 的回复:
Quote: 引用 34 楼 u012238529 的回复:

Quote: 引用 32 楼 jiaoshiyao 的回复:

不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?

你的全局是flag_a 和flag_b怎么定义的 ?
不行的话 你把 flag_a和flag_b设置成静态变量
就是静态的,public static int flag_a;哎!真心搞不懂了,弄了好几天,好多方法都试了! --------------------编程问答--------------------
引用 34 楼 u012238529 的回复:
Quote: 引用 32 楼 jiaoshiyao 的回复:

不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?
多线程就是这样的 
一个方法从开始执行到结束执行肯定要时间的
也就是说 你一次开始了好多方法这些方法还没有执行完毕 就被你断点 给终止了 --------------------编程问答--------------------

class Class2
    {
        static void Main(string[] args)
        {            
            int bb = 0;
            while (bb<20)
            {
                Thread tread=new Thread(new ThreadStart(new Class3().Fun));
                tread.Start();
                bb++;
            }
            Console.Write(Class3.i+"   "+Class3.j);
            Console.ReadLine();
            
        }
    }
public class Class3
    {
        public static int i = 0;
        public static int j = 0;

        public void Fun()
        {
            i++;
            double d = new Random().NextDouble();
            if (d > 0.5)
            {
                return;
            }
            j++;
        }
    }

基本思路是这样 --------------------编程问答--------------------
引用 37 楼 jiaoshiyao 的回复:
Quote: 引用 34 楼 u012238529 的回复:

Quote: 引用 32 楼 jiaoshiyao 的回复:

不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?
多线程就是这样的 
一个方法从开始执行到结束执行肯定要时间的
也就是说 你一次开始了好多方法这些方法还没有执行完毕 就被你断点 给终止了

你看下这个刷新数据的代码。

 private void ShowAJShiShiDataToScreen(StationData dataRow, int Protra, int intType)
        {
           // DateTime dtStart = DateTime.Now;
            flag_a++;
            Dictionary<int, Dictionary<string, List<string>>> listAJData = new Dictionary<int, Dictionary<string, List<string>>>();
            Dictionary<int, int> listAJ = new Dictionary<int, int>();
           
            if (intType == 0)
            {
                listAJData.Add(0, dicKaiShiDaiJian);
                listAJData.Add(1, dicJianCeing);
                listAJData.Add(2, dicJianCeEd);
                listAJData.Add(3, dicShenHe);

                listAJ.Add(0, dataRow.HJAJPosition.AJColIndex[0]);
                listAJ.Add(1, dataRow.HJAJPosition.AJColIndex[1]);
                listAJ.Add(2, dataRow.HJAJPosition.AJColIndex[2]);
                listAJ.Add(3, dataRow.HJAJPosition.AJColIndex[3]);

            }
            else
            {
                listAJData.Add(0, dicHphm);
                listAJData.Add(1, dicHpys);
                listAJData.Add(2, dicJcff);
                listAJData.Add(3, dicZt);



                listAJ.Add(0, dataRow.HJAJPosition.HJColIndex[0]);
                listAJ.Add(1, dataRow.HJAJPosition.HJColIndex[1]);
                listAJ.Add(2, dataRow.HJAJPosition.HJColIndex[2]);
                listAJ.Add(3, dataRow.HJAJPosition.HJColIndex[3]);
            }
            ShowAreaData d = dataRow.ShowAreaDataList[1].ListData.Find(temp => temp.AreaID == (intType == 0 ? 3 : 4));
            Bitmap bitimp = new Bitmap(d.Width, d.Height,System.Drawing.Imaging.PixelFormat.Format24bppRgb);
           
            //bitimp.PixelFormat
            
            Graphics gp = Graphics.FromImage(bitimp);

            gp.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            gp.SmoothingMode = SmoothingMode.HighQuality;
            gp.InterpolationMode = InterpolationMode.HighQualityBicubic;


            gp.Clear(Color.Black);

            StringFormat strFom = new StringFormat();
            strFom.Alignment = StringAlignment.Center;
            strFom.LineAlignment = StringAlignment.Center;
            string[] strWidths = d.Widths.Split(',');
            int intx = 0;// d.MutilText.PartInfo.iX;
            foreach (int intKey in listAJData.Keys)
            {
                List<string> strdaijingList = new List<string>();

                Font fWrite = new Font("宋体", d.FontSize);
                int intRow = intType == 0 ? dataRow.AJRows : dataRow.HJRows;
                int intShiJiHeight = d.Height / intRow;
                int intPianCha = (d.Height % intRow) / 2;
                List<string> listRowTexts = new List<string>();

                if (listAJData[intKey].TryGetValue(intType == 0 ? dataRow.AnJianCode : dataRow.HuanJianCode, out strdaijingList))
                {
                    if (strdaijingList != null)
                    {
                        if (listAJ[intKey] >= strdaijingList.Count)
                        {
                            listAJ[intKey] = 0;
                            if (intType == 0)
                            {
                                dataRow.HJAJPosition.AJColIndex[intKey] = 0;
                            }
                            else
                            {
                                dataRow.HJAJPosition.HJColIndex[intKey] = 0;
                            }
                        }

                        for (int i = listAJ[intKey], intj = 0; intj < intRow; i++, intj++)
                        {
                            listAJ[intKey]++;
                            if (intType == 0)
                            {
                                dataRow.HJAJPosition.AJColIndex[intKey]++;
                            }
                            else
                            {
                                dataRow.HJAJPosition.HJColIndex[intKey]++;
                            }
                            string strText = "";
                            if (i < strdaijingList.Count)
                            {
                                strText = strdaijingList[i];
                            }
                            //else if (dataRow.AnJianCode == "003")
                            //{
                            //    strText = "测试车辆";
                            //}
                            else
                            {
                                strText = "- - - -";
                            }
                            RectangleF fran = new RectangleF(intx, intPianCha + intShiJiHeight * intj, Convert.ToInt32(strWidths[intKey]), intShiJiHeight);
                            gp.DrawString(strText, fWrite, new SolidBrush(Color.Red), fran, strFom);
                        }
                    }
                    else
                    {
                        RectangleF fran = new RectangleF(intx, 0, Convert.ToInt32(strWidths[intKey]), intShiJiHeight);
                        gp.DrawString("", fWrite, new SolidBrush(Color.Red), fran, strFom);

                    }
                }
                intx += Convert.ToInt32(strWidths[intKey]);
               
            }


            gp.Dispose();
            //bitimp.Save("img\\" + dataRow.AnJianCode + "_" + intType.ToString() + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
            //DateTime dtEnd = DateTime.Now;
           // TimeSpan sp = new TimeSpan(dtEnd.Ticks - dtStart.Ticks);
          //  this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "生成图片耗时:" + Convert.ToInt32(sp.TotalSeconds).ToString() + "秒", true, false);
            //return;
          DateTime  dtStart = DateTime.Now;


            //Invoke(new MethodInvoker(delegate()
            // {

                  bool b = EQ2008Class.User_RealtimeConnect(dataRow.CardFlagID);

                  try
                  {
                      if (b)
                      {
                          try
                          {
                              b = EQ2008Class.User_RealtimeSendData(dataRow.CardFlagID, d.MutilText.PartInfo.iX, d.MutilText.PartInfo.iY + d.MutilText.PartInfo.iHeight
                                  , d.Width, d.Height, bitimp.GetHbitmap());
                              // Application.DoEvents();

                          }
                          catch (AccessViolationException ex)
                          {
                              b = false;
                          }
                          catch
                          {
                              b = false;
                          }
                          if (!b)
                          {
                              //System.Diagnostics.Debug.WriteLine(dataRow.StatinName + "发竤数据失败__---------" + intType.ToString());
                              this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "数据失败____-" + (intType == 1 ? "环检" : "安检"), true, true);
                          }
                          else
                          {
                              //System.Diagnostics.Debug.WriteLine(dataRow.StatinName + "发竤成功__-----------" + intType.ToString());
                              this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "数据成功____--" + (intType == 1 ? "环检" : "安检"), true, true);

                          }
                         // b = EQ2008Class.User_RealtimeDisConnect(dataRow.CardFlagID);

                      }
                  }
                  catch
                  {
                  }
                  finally
                  {
                      EQ2008Class.User_RealtimeDisConnect(dataRow.CardFlagID);
                  }

                DateTime  dtEnd = DateTime.Now;
                TimeSpan  sp = new TimeSpan(dtEnd.Ticks - dtStart.Ticks);
            //  }));
            this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "发布节目耗时:" + Convert.ToInt32(sp.TotalSeconds).ToString() + "秒", true, false);
            flag_b++;
        }

很长,但是我的意思就是在开始设个计数器,后面设个计数器,用他们的差来查看没有执行完函数的次数,并记录到字典,就是 Dictionary<int, int> source = new Dictionary<int, int>();,再通过你给我说的触发事件!可是我的计数方法在这个函数里不管用! --------------------编程问答--------------------
引用 38 楼 laiyongxin 的回复:

class Class2
    {
        static void Main(string[] args)
        {            
            int bb = 0;
            while (bb<20)
            {
                Thread tread=new Thread(new ThreadStart(new Class3().Fun));
                tread.Start();
                bb++;
            }
            Console.Write(Class3.i+"   "+Class3.j);
            Console.ReadLine();
            
        }
    }
public class Class3
    {
        public static int i = 0;
        public static int j = 0;

        public void Fun()
        {
            i++;
            double d = new Random().NextDouble();
            if (d > 0.5)
            {
                return;
            }
            j++;
        }
    }

基本思路是这样

对,我的思路就是这样的,可是现在还没实现,现在关键就是在刷新这块,调试记录没有执行完刷新的次数老是出错!麻烦你看下我发的代码,谢谢啦! --------------------编程问答-------------------- 不用词典 
新建一个类
设置三个属性
属性 node 
属性 调用TimerCallback 的Flg 
属性 单位时间
     foreach (XmlNode node in listnode)//遍历所有的stationdata节点
            { 
                weituo = new WeiTuo<XmlNode>(Set_labelText);
                StartThread(node);
类.node =node ;
List<类> StateList = new List<类>();
StateList.add(类)
forech(s in StateList )
{
if(s.单位时间==3 && s.Flg=false)
{
重启线程;
}
}
            }

  --------------------编程问答--------------------
引用 41 楼 neusoft06 的回复:
不用词典 
新建一个类
设置三个属性
属性 node 
属性 调用TimerCallback 的Flg 
属性 单位时间
     foreach (XmlNode node in listnode)//遍历所有的stationdata节点
            { 
                weituo = new WeiTuo<XmlNode>(Set_labelText);
                StartThread(node);
类.node =node ;
List<类> StateList = new List<类>();
StateList.add(类)
forech(s in StateList )
{
if(s.单位时间==3 && s.Flg=false)
{
重启线程;
}
}
            }

 

请问s.单位时间和s.Flg是什么意思呢? --------------------编程问答--------------------
引用 41 楼 neusoft06 的回复:
不用词典 
新建一个类
设置三个属性
属性 node 
属性 调用TimerCallback 的Flg 
属性 单位时间
     foreach (XmlNode node in listnode)//遍历所有的stationdata节点
            { 
                weituo = new WeiTuo<XmlNode>(Set_labelText);
                StartThread(node);
类.node =node ;
List<类> StateList = new List<类>();
StateList.add(类)
forech(s in StateList )
{
if(s.单位时间==3 && s.Flg=false)
{
重启线程;
}
}
            }

 

关键的问题就是怎么判断callback函数Flg的真假,现在的问题就是怎么判断刷新的成功还是失败! --------------------编程问答--------------------                 if (dataRow.State > 0||!dataRow.IsShow)
{
//---这里 False                 
return; }
 
                dataRow.State = 1;
 
                DateTime dtStart = DateTime.Now;
                if (!PingResult(dataRow.IP))
                {
                    this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "网络不通,无法显示!!!", false, true);//我现在是这种状态,一直走这个分支,这个分支不算刷新失败
//---这里 False                   
 return;
                }
//---这里 True

不知道理解的对不对 --------------------编程问答--------------------
引用 44 楼 neusoft06 的回复:
                if (dataRow.State > 0||!dataRow.IsShow)
{
//---这里 False                 
return; }
 
                dataRow.State = 1;
 
                DateTime dtStart = DateTime.Now;
                if (!PingResult(dataRow.IP))
                {
                    this.ShowText(dataRow.StatinName, dataRow.CardFlagID, "网络不通,无法显示!!!", false, true);//我现在是这种状态,一直走这个分支,这个分支不算刷新失败
//---这里 False                   
 return;
                }
//---这里 True

不知道理解的对不对


嗯,但是走了这个分支不一定代表刷新成功,可能会没有执行完毕就卡死了,我的想法是判断没有执行完毕的次数(也就是卡死的次数),你的想法是判断走哪个分支吗? --------------------编程问答-------------------- 在执行比较慢的地方判断是否超过一定时间了 
如果超过了就 False  --------------------编程问答--------------------
引用 46 楼 neusoft06 的回复:
在执行比较慢的地方判断是否超过一定时间了 
如果超过了就 False 

是个方法,但是现在是想通过判断次数实现,因为是多线程调用一个刷新函数,所以老是出错! --------------------编程问答-------------------- ,每个节点类也就是每个线程加一个计数器,然后用为依托通知调用次数给监视模块
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,