c#winform多线程实现进度条

hellofking 2009-09-18 12:54:13
我作了一个小程序,在登陆窗体上点击登陆按钮,验证用户名和密码以后调出主窗体,现在我想在验证用户是否合法的同时,显示一个进度条,当进度条走完以后,主窗体再显示出来,本人刚开始学c#,肯请高手们帮帮忙,给个设计思想,有代码更好.先表示感谢了
...全文
1144 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之影子 2009-09-18
  • 打赏
  • 举报
回复
各位高手,如何在进度条上显示百分比,在线等,谢谢

你与数据库的交互是一个不定时也无法控制时间的操作.

故用百分比不合适.

如果你是数据复制或是下载文件一类的,可以做,因为知道其大小或进度
Tiantiandiandian 2009-09-18
  • 打赏
  • 举报
回复
运行的东西是一个很长的操作吗?
hellofking 2009-09-18
  • 打赏
  • 举报
回复
各位高手,如何在进度条上显示百分比,在线等,谢谢
Tiantiandiandian 2009-09-18
  • 打赏
  • 举报
回复
虽然没有现成的例子,但你可以用backgroundwork的控件。这个可以很方便的让你上手。
我就是这么做的。个人觉得,相当好用
henry827 2009-09-18
  • 打赏
  • 举报
回复
新建一个窗口progressForm,上面绘制一个进度条就是了,新建线程创建progressForm,如果有跨线程访问控件的情况需要在progressForm里面添加如下代码
i. 在类中见一个委托delegate void SetTextCallback();
ii. 在新建线程访问的函数中写入如下代码
if (this.progress.InvokeRequired)
{
{
SetTextCallback d = new SetTextCallback(startProgress);
this.Invoke(d, new object[] { });
}
else
{
progress.PCElapsedTime = 0;
for (int i = 0;; )
{
if(progress.value==100)
{
progress.value = 0;
}
progress.value += 1 ;
System.Threading.Thread.Sleep(1000);
}
this.Close();
}
}
当你验证结束的时候直接终止刚才新建的线程就行了
ruanwei1987 2009-09-18
  • 打赏
  • 举报
回复
和线程有关吗?我也没做过 帮你定下吧,
能不能这样想,验证登陆→进度条窗口→主窗口!!
OhYeah_Dragon 2009-09-18
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ProcessBarInNewWindow
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private FrmProcessBar myProcessBar = null;

private delegate bool IncreaseHandle(int nValue);

private IncreaseHandle myIncrease = null;

private void Form2_Load(object sender, EventArgs e)
{
Thread thdSub = new Thread(new ThreadStart(ThreadFun));

thdSub.Start();
}

private void ShowProcessBar()
{

myProcessBar = new FrmProcessBar();

myIncrease = new IncreaseHandle(myProcessBar.Increase);

myProcessBar.ShowDialog();

myProcessBar = null;
}

private void ThreadFun()
{

MethodInvoker mi = new MethodInvoker(ShowProcessBar);

this.BeginInvoke(mi);



Thread.Sleep(1000);//Sleep a while to show window



bool blnIncreased = false;

object objReturn = null;

do
{

Thread.Sleep(50);

objReturn = this.Invoke(this.myIncrease,

new object[] { 2 });

blnIncreased = (bool)objReturn;

}

while (blnIncreased);

}
}
}
风之影子 2009-09-18
  • 打赏
  • 举报
回复
delegate void HandleInterfaceUpdateDelegate(); //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
Thread td;
public formMain()
{
InitializeComponent();
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(StartPro); //实例化委托对象
}


在你进行操作的方法里第一句加上:
this.Invoke(interfaceUpdateHandle);//用指定的参数列表执行指定的委托

最后一行加上:
td.Abort();


这是相关的方法。
private void chang()
{
ProcessBar obj = new ProcessBar();注:ProcessBar是你放置图片的窗口
obj.ShowDialog();
}


public void StartPro()
{
td= new Thread(chang);
td.Start();
}

111,098

社区成员

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

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

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