form1void ShowFrm()
{
form2 frm=new form2()
frm.PrgsStart();
try
{
a();
frm.SetLabText("a");
b();
frm.SetLabText("b");
c();
frm.SetLabText("c");
}
finally
{
frm.PrgsFinish()
}}frm1里的 a(),b() c() 为其他复杂操作form2
{ public void PrgsStart()
{
this.Show();
this.prgsBar.Maximum = 500;
this.prgsBar.Value = 0;
this.prgsBar.Step = 5; IsFinished = false;
m_StartCount = System.Environment.TickCount; Thread td = new Thread(new ThreadStart(PrgsStartEvent));
td.Start();
}
private void PrgsStartEvent()
{
while (!IsFinished)
{
PerformStep();
Thread.Sleep(200);
}
}
private void PerformStep()
{
this.Refresh();
if (this.prgsBar.Value >= this.prgsBar.Maximum)
this.prgsBar.Value = 0;
this.prgsBar.PerformStep();
int _tick = System.Environment.TickCount - m_StartCount;
if (_tick > 0)
{
SetLabText(this.lblTick, "秒:" + Convert.ToDouble((double)_tick / 1000).ToString("0.00"));
}
} public void PrgsFinish()
{
this.Refresh();
if (this.Created)
{
this.Close();
Dispose();
}
} public void SetLabText(Lable lab, string text)
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
}在form1 防治一个按钮 执行方法 ShowFrm() 多次点击后会出现很多错误,例如 对象正在其他地方使用等
不知道有什么好的办法解决?
{
form2 frm=new form2()
frm.PrgsStart();
try
{
a();
frm.SetLabText("a");
b();
frm.SetLabText("b");
c();
frm.SetLabText("c");
}
finally
{
frm.PrgsFinish()
}}frm1里的 a(),b() c() 为其他复杂操作form2
{ public void PrgsStart()
{
this.Show();
this.prgsBar.Maximum = 500;
this.prgsBar.Value = 0;
this.prgsBar.Step = 5; IsFinished = false;
m_StartCount = System.Environment.TickCount; Thread td = new Thread(new ThreadStart(PrgsStartEvent));
td.Start();
}
private void PrgsStartEvent()
{
while (!IsFinished)
{
PerformStep();
Thread.Sleep(200);
}
}
private void PerformStep()
{
this.Refresh();
if (this.prgsBar.Value >= this.prgsBar.Maximum)
this.prgsBar.Value = 0;
this.prgsBar.PerformStep();
int _tick = System.Environment.TickCount - m_StartCount;
if (_tick > 0)
{
SetLabText(this.lblTick, "秒:" + Convert.ToDouble((double)_tick / 1000).ToString("0.00"));
}
} public void PrgsFinish()
{
this.Refresh();
if (this.Created)
{
this.Close();
Dispose();
}
} public void SetLabText(Lable lab, string text)
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
}在form1 防治一个按钮 执行方法 ShowFrm() 多次点击后会出现很多错误,例如 对象正在其他地方使用等
不知道有什么好的办法解决?
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
我用了线程 InvokeRequired 是不是始终都为 false ?
判断InvokeRequired ,如果为true,则通过委托封装到主线程上进行,为false,标识就在主线程上,直接调用,不用委托。
现在前面添加代理:public delegate void RefreshDlg(Lable lab, string txt); public void SetLabText(Lable lab, string text)
{
if(lab.InvokeRequired)
RefreshDlg refresh = new RefreshDlg(SetLabText);
}
else
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
public void SetLabText(Lable lab, string text)
{
if(lab.InvokeRequired)
{
RefreshDlg refresh = new RefreshDlg(SetLabText);
}
else
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
}
我发现下午脑子不行了,老错public void SetLabText(Lable lab, string text)
{
if(lab.InvokeRequired)
{
RefreshDlg refresh = new RefreshDlg(SetLabText);
this.Invoke(refresh, new object[] { lab,text });
}
else
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
}
this.Invoke(refresh, new object[] { lab,text });
这样不行吧?SetLabText 方法带参数的
{
if(lab.InvokeRequired)
{
RefreshDlg refresh = new RefreshDlg(SetLabText);
this.Invoke(refresh, new object[] { lab,text });
}
else
{
this.Refresh();
if (lab == null || lab.IsDisposed)
return;
lab.Text = text;
lab.Refresh();
this.Refresh();
}
}这种方法我试过了 不过lab的Text 要等到复杂处理过后才显示变化