怎么判断一个函数是否执行完毕并且记录此函数没有执行完的次数?
怎么判断一个函数是否执行完毕并且记录此函数没有执行完的次数?并且将此函数没有执行完毕的次数记录到字典。注:此函数每10s便会被调用一次! 刷新 函数 --------------------编程问答-------------------- 这……。声明两个int 并初始化0,一个用来计算调用次数(放在调用函数前,每次++),一个用来计算执行次数(放在函数里面,主代码后面),没有执行的次数不就是总数-执行数 --------------------编程问答-------------------- 这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390624556
这个跟你应该是一样的道理 --------------------编程问答--------------------
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启! --------------------编程问答-------------------- 我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启! --------------------编程问答--------------------
--------------------编程问答-------------------- 那就设置成static就差不多了 --------------------编程问答--------------------
System.Threading.Timer tim = new System.Threading.Timer(ti, stationData.CardFlagID, 0, 10000);
//10s调用一次ti
ti = new TimerCallback(ShowDataToScreenStation);
private void ShowDataToScreenStation(object stationFlagID){……}
给个例子看看先,新手啊! --------------------编程问答-------------------- 楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!! --------------------编程问答-------------------- 提的问题本身有问题,线程没有执行完,立强行结束了吗? --------------------编程问答-------------------- stub1
you code
stub2
deltas = before -after --------------------编程问答--------------------
这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊 --------------------编程问答--------------------
楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!!
是10s执行一次,想判断ShowDataToScreenStation(object stationFlagID)这个函数是否执行完毕,这个函数是刷新数据用的,如果执行完毕了就说明刷新成功了,如果没有就说明刷新数据失败,但是不论数据刷新成功或者失败都会10s调一次这个函数!我就是想通过记录刷新失败的次数来作为监控线程的判断条件。 --------------------编程问答--------------------
这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊
但是我还想把每次记录放进字典里,因为有好几个线程,想把记录每个线程的次数放进字典里面,然后遍历! --------------------编程问答--------------------
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
int count1 = 0;--------------------编程问答--------------------
int count2 = 0;//两个都是全局的
......
conut1++;
ShowDataToScreenStation(stationFlagID);
......
public void ShowDataToScreenStation(object stationFlagID)
{
......
count2++;
}
觉得你的问题好简单,设置两个计数器就行了。。。
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!int count1 = 0;
int count2 = 0;//两个都是全局的
......
conut1++;
ShowDataToScreenStation(stationFlagID);
......
public void ShowDataToScreenStation(object stationFlagID)
{
......
count2++;
}
能把你的代码贴出来吗?
好的,稍等! --------------------编程问答--------------------
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++;
}
能把你的代码贴出来吗?
好的,稍等!
定义计数器变量就好了
我上面做的也是定义了计数器变量,但是貌似有问题 --------------------编程问答-------------------- 每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。 --------------------编程问答--------------------
每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。
不可以根据object stationFlagID作为key存进字典吗?遍历字典不可以吗
每10秒调用一次,且之前调用的没有挂起吧?这样一来好几个委托一起进行,只用一个值记录是不够的,你记录的只能是总量而不是单个委托的数量。
楼主 你的这个问题貌似是核心在“是否执行完毕”每10ms执行一次 也就是说这个函数 必须在10ms中执行完毕
我想了好长时间 觉得你的问题有问题!!!
能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊 --------------------编程问答--------------------
能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊
嗯,太谢谢你了,那个10s钟刷新弄出来了,现在就是弄这个问题了,刚接触编程,所以问的比较多! --------------------编程问答-------------------- Task mainTask = Task.Factory.StartNew(() =>
{
}
用任务做是不是能满足你的需求呢 --------------------编程问答-------------------- 我的是多线程,貌似不能用这种方法 --------------------编程问答--------------------
能实现效果都行吧 不过我上次给你看好像是 你原来的代码有问题 你要确保原来他能够十秒钟刷新一次!!
嗯嗯 你现在先把10秒钟刷新一次 的实现了 在尝试三分钟的检测
我给你弄了算是我的了 你要自己找思路慢慢弄 这样你才能进步啊
大师,不好意思又要请教你了,我的这种计数方法在多线程中是不是就无法使用啊? --------------------编程问答-------------------- 不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
--------------------编程问答--------------------
这个有什么意义吗
在函数最开始 记录被调用次数
在函数最后面 记录调用完成次数
相减 就是没有调用完的次数
我可能没描述清楚!就是我是生成了很多线程,每个线程里面会10s刷新一次数据,也就是10s掉一次A函数,如果A函数有三次没有执行完,也就是刷新失败,我就用监控线程关闭此线程然后再开启!
那就设一个全局 或者在类中定义一个静态的变量 然后按我说的调用次序来更改这个变量就可以了啊
多线程都调用一个函数进行刷新,这样可以吗? --------------------编程问答--------------------
不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?
不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
你的全局是flag_a 和flag_b怎么定义的 ?
不行的话 你把 flag_a和flag_b设置成静态变量 --------------------编程问答--------------------
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局flag_a,末尾弄了个flag_b,调试时候发现flag_a=12了,flag_b才=0,这种多线程是不是不能这么搞啊?
不是啊 多线程中貌似没有这种限制吧 应该是代码流程上的问题
你的全局是flag_a 和flag_b怎么定义的 ?
不行的话 你把 flag_a和flag_b设置成静态变量
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局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++;
}
}
基本思路是这样 --------------------编程问答--------------------
多线程就是这样的
多线程都调用了一个刷新函数!我在刷新函数的开始弄了个全局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>();,再通过你给我说的触发事件!可是我的计数方法在这个函数里不管用! --------------------编程问答--------------------
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)
{
重启线程;
}
}
}
--------------------编程问答--------------------
不用词典
新建一个类
设置三个属性
属性 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是什么意思呢? --------------------编程问答--------------------
不用词典
新建一个类
设置三个属性
属性 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
不知道理解的对不对 --------------------编程问答--------------------
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 --------------------编程问答--------------------
在执行比较慢的地方判断是否超过一定时间了
如果超过了就 False
是个方法,但是现在是想通过判断次数实现,因为是多线程调用一个刷新函数,所以老是出错! --------------------编程问答-------------------- ,每个节点类也就是每个线程加一个计数器,然后用为依托通知调用次数给监视模块
补充:.NET技术 , C#