请大家看看我错到哪了。
public delegate void UpdateMsgDelegate(int msg);//首先声明一个委托类型
UpdateMsgDelegate myDelegate;//声明该委托类型的成员
int finish = 0;//判断执行的进度 0,开始 1 结束 private void button1_Click(object sender, EventArgs e)
{
//点击按钮。
myDelegate = new UpdateMsgDelegate(UpdateMsg);//委托与方法挂钩
Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程
t.Start();//线程启动
finish = 0;//操作开始
//中间是耗时操作 ,从sql读数据,写入excel
finish = 1;//操作完毕 }
private void doSomeThing()
{
if (progressBar1.InvokeRequired)//如果跨线程调用
{
this.progressBar1.Invoke(myDelegate, new object[] { finish });//Invoke委托方法
}
} private void UpdateMsg(int p)//这个是委托方法。
{
while(finish == 0)
{ this.progressBar1.Value += 2;
}
}
发现没什么作用....不报错,但是执行耗时操作的时候进度条控件是不变的。调试发现在委托方法UpdateMsg判断时 finish已经为1了。也就是说耗时操作结束了这个方法才起作用。求教如何解决
public delegate void UpdateMsgDelegate(int msg);//首先声明一个委托类型
UpdateMsgDelegate myDelegate;//声明该委托类型的成员
int finish = 0;//判断执行的进度 0,开始 1 结束 private void button1_Click(object sender, EventArgs e)
{
//点击按钮。
myDelegate = new UpdateMsgDelegate(UpdateMsg);//委托与方法挂钩
Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程
t.Start();//线程启动
finish = 0;//操作开始
//中间是耗时操作 ,从sql读数据,写入excel
finish = 1;//操作完毕 }
private void doSomeThing()
{
if (progressBar1.InvokeRequired)//如果跨线程调用
{
this.progressBar1.Invoke(myDelegate, new object[] { finish });//Invoke委托方法
}
} private void UpdateMsg(int p)//这个是委托方法。
{
while(finish == 0)
{ this.progressBar1.Value += 2;
}
}
发现没什么作用....不报错,但是执行耗时操作的时候进度条控件是不变的。调试发现在委托方法UpdateMsg判断时 finish已经为1了。也就是说耗时操作结束了这个方法才起作用。求教如何解决
private void doSomeThing()
{
if (progressBar1.InvokeRequired)//如果跨线程调用
{
this.progressBar1.Invoke(myDelegate, new object[] { finish });//Invoke委托方法
}
}耗时操作结束后
//中间是耗时操作 ,从sql读数据,写入excel
finish = 1;//操作完毕
这中间的代码呢??。。没看到中间还有东西
finish = 0;//操作开始
//中间是耗时操作 ,从sql读数据,写入excel
finish = 1;//操作完毕
中间就是耗时操作。他是放在这个操作后面的
//创建了一个对象。用来对excele操作
int rowIndex = 1;//行的起始是1而不是0
int colIndex = 0;//行,列
excel.Application.Workbooks.Add(true);
//Creates a new workbook. The new workbook becomes the active workbook. Returns a Workbook object.
System.Data.DataTable table = GetData(); //填充table
foreach (DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;//将sql内每列的名称赋给eccel的第一行的单元格
}
foreach (DataRow row in table.Rows)
{
rowIndex++;//第一次是从2开始
colIndex = 0;//重新赋值
foreach (DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
Worksheet ws = (Worksheet)excel.ActiveSheet; excel.Visible = true;
与
finish=1之间加上Thread.sleep(10000);这样试试呢
加在 form_load中就行,也就可以不用委托了。呵呵
为什么处理耗时操作前invoke调用 而操作后才轮到委托的函数?另外发现这个忘记写sleep了不过测试了一下依旧没什么改变。
finish=1的时候,加上日志,
然后在线程处理的地方加上日志,这样就只是调用顺序了
finish = 1;中存在问题,解决这个问题的时候,应该首先获得你需要写入的数据条数,设置为progressbar 的 MaxValue,然后写过一条以后在 progressbar.Value 加一。楼主处理问题的方式有些那个...就问题说问题的话,这个问题在于你在主进程里面写的耗时操作,程序在不运行完 button click 时不会执行下面的操作(比如说重画界面),即使你在另外一个线程里面更改值也不会画到界面上,所以说,把耗时操作放在线程里面才是正解
finish = 1;//操作完毕
这个应该在线程里面完成才对.