求问C#大神

lc1992345 2012-10-30 04:34:05
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication5
{
public delegate void progressbarDelegate();



public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();


}

private void Form1_Load(object sender, EventArgs e)
{

}



private void button1_Click(object sender, EventArgs e)
{
//Thread thread_bar1 = new Thread(new ThreadStart(ttread));
//thread_bar1.Start();
//delprogress(progress);
Thread demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
}

private void ThreadProcSafe()
{
this.progress();
}




private void progress()
{




if (this.progressBar1.InvokeRequired || this.label5.InvokeRequired)
{

progressbarDelegate d = new progressbarDelegate(progress);

if(this.IsHandleCreated)
{
this.Invoke(d, new object[] { });
}
}
else
{

progressBar1.Maximum = 100;
for (int rownum = 1; rownum <= 100; rownum++)
{
//你所要执行的业务。
rownum++;//循环次数
//把当前循环次数赋值给进度条的value。
progressBar1.Value = rownum;
// 这个很关键,让程序去执行进度条的前进动作
label5.Text = progressBar1.Value + "%";

Application.DoEvents();
Thread.Sleep(100);
if (rownum == 100)
{
rownum = 0;
}
}
}
}



}
}

程序执行无误,但是点击关闭按钮之后,红色部分会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。折腾了一天了!
...全文
182 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大咸鱼 2012-10-31
  • 打赏
  • 举报
回复
将线程定义在外面.

Thread demoThread =null;
private void button1_Click(object sender, EventArgs e)
{
//Thread thread_bar1 = new Thread(new ThreadStart(ttread));
//thread_bar1.Start();
//delprogress(progress);
demoThread =new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
}




在窗体关闭的事件中添加以下代码
try
{
if (demoThread .IsAlive)
{
demoThread .Abort();
}
}
catch { }
maomixi 2012-10-31
  • 打赏
  • 举报
回复
 BeginInvoke((EventHandler)delegate
{
label2.Text = "kao";
});

这么写试试
wuyq11 2012-10-30
  • 打赏
  • 举报
回复
Windows控件,只能在创建它的线程里访问它,
在不同的线程访问,要通过当前线程的Invoke方法来调用
sosoben 2012-10-30
  • 打赏
  • 举报
回复
你Thread.Sleep(100); 是线程在sleep 了 所以窗体关闭,线程还没运行完吧,关闭窗体的时候加上关闭线程吧
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
Set();

}

delegate void SetValueHandler(string key,string value);
SetValueHandler svh;
private void Set()
{
svh = new SetValueHandler(SetControlValue);
svh.Invoke("label1", "test1");
svh.Invoke("label2", "test2");
}

private void SetControlValue(string key, string value)
{

Control control = this.Controls.Find(key, true)[0];
if (control.InvokeRequired)
{
control.Invoke(svh, new object[] { key, value });
}
else
{
control.Text = value;
}
}



自己改去, 举一反三,可以改成通用的方法。
lc1992345 2012-10-30
  • 打赏
  • 举报
回复
自己顶一下

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧