我在一个FORM家载时候要执行一个存储过程要较长时间,并且时间不确定。要用一个弹出窗体显示一下进度,看了许多参考资料,也看了knight94(愚翁)的文章,知道用线程和委托,但写出来还是进度条不动呀,执行完了才开始动。怎么回事呀。急呀。//-----------窗体变量---------- private frmProgressBar f = null;
private delegate void setPro(); //委托 //---------启动滚动条-----------
private void startPro()
{
// MethodInvoker mi = new MethodInvoker(this.timer1.Start);
setPro s = this.timer1.Start;
this.BeginInvoke(s);
Thread.Sleep(100);
} private void timer1_Tick(object sender, EventArgs e)
{
f.setpro();
} //--------进度条窗体的方法----------------
public void setpro()
{
if (progressBar1.Value < progressBar1.Maximum)
{
this.progressBar1.Value++;
}
}//-------------------启动线程----------------- Thread t1 = new Thread(new ThreadStart(this.startPro));
Thread t2 = new Thread(new ThreadStart(this.ExecPro));
//(ExecPro 是一个执行存储过程的方法)
t1.Start();
t2.Start(); f.Show();
private delegate void setPro(); //委托 //---------启动滚动条-----------
private void startPro()
{
// MethodInvoker mi = new MethodInvoker(this.timer1.Start);
setPro s = this.timer1.Start;
this.BeginInvoke(s);
Thread.Sleep(100);
} private void timer1_Tick(object sender, EventArgs e)
{
f.setpro();
} //--------进度条窗体的方法----------------
public void setpro()
{
if (progressBar1.Value < progressBar1.Maximum)
{
this.progressBar1.Value++;
}
}//-------------------启动线程----------------- Thread t1 = new Thread(new ThreadStart(this.startPro));
Thread t2 = new Thread(new ThreadStart(this.ExecPro));
//(ExecPro 是一个执行存储过程的方法)
t1.Start();
t2.Start(); f.Show();
一会this一会f...........
Tick设的是多少?
Sleep(100)+Tick是否大于执行时间
因为你说的进度条会走,只是再之后走...
Tick设的1000
改成this.startPro试试
private void InvokeFun()
{
if (progressBar1.Value < 100)
{
progressBar1.Value = progressBar1.Value + 1;
}
}
//子线程入口
private void ThreadFun()
{
MethodInvoker mi = new MethodInvoker(this.InvokeFun);
for (int i = 0; i < 100; i++)
{
this.BeginInvoke(mi);
//Thread.Sleep(100);
}
} private void button1_Click(object sender, EventArgs e)
{
Thread thdProcess = new Thread(new ThreadStart(ThreadFun));
thdProcess.Start();
}
发不出邮件不知道你收到没再贴下
1.frmGrid里面
//通用加载过程
Thread t1 = new Thread(new ThreadStart(this.startPro));
//startPro();
Thread t2 = new Thread(new ThreadStart(this.ExecPro));
t1.Start();
t2.Start();
程序走不到这 所以先不管
前面有个f.Show
加上
Thread tt1 = new Thread(new ThreadStart(this.startPro));
tt1.Start();
tt1.Join();后面一大堆的SQL操作不行,把它们提出来放在一个函数里面同样用线程去执行 Thread tt1 = new Thread(new ThreadStart(this.startPro));
tt1.Start();
tt1.Join();
f.Show();
//加上 Thread tht = new Thread(new ThreadStart(th//你放的函数));
tht.Start();改 //启动滚动条
private void startPro()
{
// MethodInvoker mi = new MethodInvoker(this.timer1.Start);
//setPro s = this.timer1.Start;
//this.BeginInvoke(s);
// Thread.Sleep(100);
this.BeginInvoke(new EventHandler(f.TimeStar));
}改f.TimeStar定义
public void TimeStar(object sender,EventArgs e)
有些细节还要改,总体来说就是因为你后面的sql操作太多占用了主线程导致程序没空理会Invoke的代码,所以要把后面那一堆sql也放到线程里执行
还一些细节要改 比如f.Close也要InvokePS:第一次看女生写的代码,还是这么大的一个项目:)女生代码写的就是工整,注释都是对齐的,界面也漂亮,就是稍微有点混乱嘻嘻
Red_angelX(当你手淫你会想起谁)
晚上在看看,对了,你的名字怎么听着这么别扭呀
Red的签名,倒是够狼的。。
Red_angelX(当你手淫你会想起谁)
感谢你的热情,不过你的热情不要只对"女"的哟.现在对委托和线程还是有点迷糊,虽然大体知道怎么会事,不过公司刚买了<<C#高级编程第4版>>,现正在阅读委托和事件这一章,受益非浅.相信读完就会"蓦然回首,那人却在灯火阑珊处的感觉的"
好了,接帖