public delegate void WeiTuo<XmlNode>(XmlNode s ); //定义委托
private WeiTuo<XmlNode> weituo; //定义委托……
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");
ti = new TimerCallback(ShowDataToScreenStation);
foreach (XmlNode node in listnode)//遍历所有的stationdata节点
{
weituo = new WeiTuo<XmlNode>(Set_labelText);//委托
StartThread(node);
}}
public void Set_labelText(XmlNode strText)
{
StationData stationData = new StationData(strText);
//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)指定的委托。
dicThread.Add(stationData.CardFlagID.ToString(), tim); }
this.flowLayoutPanel1.Controls.Add(lab);
}
private void Run()
{
Invoke(weituo); //就是这里报错,参数计数不匹配
}
void StartThread(XmlNode x)
{
// ParameterizedThreadStart ParStart = new ParameterizedThreadStart(Run);
ThreadStart threadtest = new ThreadStart(Run);
Thread threadNew=new Thread(threadtest);
threadNew.Start();
}请求大神给指导指导,小弟是个新手啊!threaddelegatexmllabel遍历
private WeiTuo<XmlNode> weituo; //定义委托……
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");
ti = new TimerCallback(ShowDataToScreenStation);
foreach (XmlNode node in listnode)//遍历所有的stationdata节点
{
weituo = new WeiTuo<XmlNode>(Set_labelText);//委托
StartThread(node);
}}
public void Set_labelText(XmlNode strText)
{
StationData stationData = new StationData(strText);
//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)指定的委托。
dicThread.Add(stationData.CardFlagID.ToString(), tim); }
this.flowLayoutPanel1.Controls.Add(lab);
}
private void Run()
{
Invoke(weituo); //就是这里报错,参数计数不匹配
}
void StartThread(XmlNode x)
{
// ParameterizedThreadStart ParStart = new ParameterizedThreadStart(Run);
ThreadStart threadtest = new ThreadStart(Run);
Thread threadNew=new Thread(threadtest);
threadNew.Start();
}请求大神给指导指导,小弟是个新手啊!threaddelegatexmllabel遍历
解决方案 »
- 一个C#程序 怎样能计算鼠标点击的次数?
- vs生成的exe窗口文件在打开之后关闭 仍在进程中是什么原因
- 判断网卡是否连接
- 关于变量申明的问题 是使用一个变量(让这个变量的值变来变去 还是每遇到一块就申明一个变量?)
- 如何下载C#代码段编辑工具--Snippy-Visual Studio Code Snippet Editor
- C# comboBox删除重复记录(不连接数据库!)
- 我如何在把数据库中的十个项目自动生成到form1的文本框??
- sql语句在存储过程中调试 正确 但.net执行此存储过程是提示错误
- vs2010打包应用程序时如何包含virtual c++ 2005
- 新人咨询:在winform中如何对oracle数据进行备份和还原?
- 关于js的跨域的问题 --------------------------------------------------------------------
- 请问各位,将combox嵌入到datagridview中,如何让combox的内容为数据库取出的列值?
->
Invoke(new Action(() => weituo(这里传一个XmlNode)));
{
// ParameterizedThreadStart ParStart = new ParameterizedThreadStart(Run);
ThreadStart threadtest = new ThreadStart(() => (Invoke(new Action(() => weituo(x)))));
Thread threadNew=new Thread(threadtest);
threadNew.Start();
}
weituo.Invoke(一个XMLNode参数)就如同Set_labelText(一个XMLNode参数)
weituo.Invoke(一个XMLNode参数)就如同Set_labelText(一个XMLNode参数)如果在Run(XmlNode d){}这样写的话,下面的线程函数就会报错,传object可以,我指导这是基类,难道是XmlNode的参数不能在线程中传吗?
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。不明白你这个程序 为什么又是循环foreach 又是System.Threading.Timer 又是线程Thread
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。不明白你这个程序 为什么又是循环foreach 又是System.Threading.Timer 又是线程Thread
大体上就是在面板上生成一个个label,而一个线程包含一个label,label里的数据就是xml的,所以现在想把xml的值传到线程里的label中,不知道这样说你明白不?
{
weituo.Invoke(s);
}
void StartThread(XmlNode x)
{
Thread threadtest = new Thread(new ThreadStart(() => { Run(x); }));
threadtest.Start();
}
刚才的问题解决了,可是又出现新的问题我明显使用了委托和Invoke函数啊?
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。不明白你这个程序 为什么又是循环foreach 又是System.Threading.Timer 又是线程Thread
大体上就是在面板上生成一个个label,而一个线程包含一个label,label里的数据就是xml的,所以现在想把xml的值传到线程里的label中,不知道这样说你明白不?你这个写法不对,你把System.Threading.Timer(多线程定时器)放在循环里面,就是每次循环都创建一个定时器....定义一个线程就够了哇
object _lock = new object();
Thread th = new Thread(){new ThreadStart(()=>{ object(lock(_lock){ foreach(...){
读xml,创建lable,AddLable(lable) } })})};th.start();th,isPostBack=true;
public void AddLable(Lable l){this.Invoke(new Action(()=>{ 面板上添加lable }))}
没用VS 可能有点错误
Thread th = new Thread(new ThreadStart(()=>{ Run(); }));
public void Run()
{
this.Invoke(new Action(()=>{ 方法体...}));
}方法体是哪个方法体,是Set_labelText吗?麻烦了。不明白你这个程序 为什么又是循环foreach 又是System.Threading.Timer 又是线程Thread
大体上就是在面板上生成一个个label,而一个线程包含一个label,label里的数据就是xml的,所以现在想把xml的值传到线程里的label中,不知道这样说你明白不?你这个写法不对,你把System.Threading.Timer(多线程定时器)放在循环里面,就是每次循环都创建一个定时器....定义一个线程就够了哇
object _lock = new object();
Thread th = new Thread(){new ThreadStart(()=>{ object(lock(_lock){ foreach(...){
读xml,创建lable,AddLable(lable) } })})};th.start();th,isPostBack=true;
public void AddLable(Lable l){this.Invoke(new Action(()=>{ 面板上添加lable }))}
没用VS 可能有点错误 定时器是刷新label里面的数据的,但是label也得是一个独立的线程,所以我这么做的。不过现在搞不定了。
上面那个错误"从不是创建控件..." 把线程设为:thread.ApartmentState = ApartmentState.STA;
void StartThread(XmlNode x)
{
new Thread(() => Set_labelText(x)).Start();
} public void Set_labelText(XmlNode strText)
{
this.Invoke((Action<XmlNode>)delegate(XmlNode node)
{
StationData stationData = new StationData(strText);
//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)指定的委托。
dicThread.Add(stationData.CardFlagID.ToString(), tim); }
this.flowLayoutPanel1.Controls.Add(lab);
}, strText);
}
改成
StationData stationData = new StationData(node);
{
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节点
{ //Set_labelText(node);
weituo = new WeiTuo<XmlNode>(Set_labelText);
//wt = new WT_test(Test);
StartThread(node);
}
//生成已经包含的检查站的下拉菜单
foreach (StationData m in Program.listStationList)//这里在完成上面的遍历后,Program.listStationList没数据
{
ToolStripMenuItem msta = new ToolStripMenuItem(m.StatinName);
msta.Tag = m.StatinName;
msta.Click += new EventHandler(新增检测站ToolStripMenuItem_Click);
this.检测站参数设置ToolStripMenuItem.DropDownItems.Add(msta);
}
this.timRefreshData_Tick(null, null); 开始发送正常数据ToolStripMenuItem_Click(null, null);
FileInfo f = new FileInfo("StationConfig.xml");
iStartDateXmlOLD = f.LastWriteTime.Ticks;
f = new FileInfo("EQ2008_Dll_Set.ini");
iIntDatexmlOLD = f.LastWriteTime.Ticks; this.timer1.Enabled = true;
}
个人觉得应该是要等所有的添加Item子线程执行完了之后才通知下拉列表把Item添加进去的