加载进度条问题的探讨

九章落地 2007-03-19 04:44:53
我现在做一个登录窗体,点击登录按钮后执行下面动作:
1、更新本地数据库。
2、打开主窗体,并关掉登录窗体。

因为执行时间有点长,我想加入一个进度条。
小弟对多线程编程一知半解,在BackgroudWorker的DoWork事件里,如何计算动作执行完成的百分比呢?如何得到窗体的Show方法所用的时间呢?

虚心向各位高手请教,谢谢!
...全文
911 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
haipingma 2007-05-30
  • 打赏
  • 举报
回复
study
甴曱 2007-03-20
  • 打赏
  • 举报
回复
//你测试一下下面这个代码。
public interface ISplashForm
{
void SetStatusInfo(string NewStatusInfo);
}

public class Splasher
{
private static Form m_SplashForm = null;
private static ISplashForm m_SplashInterface = null;
private static Thread m_SplashThread = null;
private static string m_TempStatus = string.Empty;

/// <summary>
/// 显示过渡窗口
/// </summary>
public static void Show(Type splashFormType)
{
if (m_SplashThread != null)
return;
if (splashFormType == null)
{
throw (new Exception("splashFormType is null"));
}

m_SplashThread = new Thread(new ThreadStart(delegate()
{
CreateInstance(splashFormType);
Application.Run(m_SplashForm);
}));

m_SplashThread.IsBackground = true;
m_SplashThread.SetApartmentState(ApartmentState.STA);
m_SplashThread.Start();
}



/// <summary>
/// 设置载入状态
/// </summary>
public static string Status
{
set
{
if (m_SplashInterface == null || m_SplashForm == null)
{
m_TempStatus = value;
return;
}
m_SplashForm.Invoke(
new SplashStatusChangedHandle(delegate(string str) { m_SplashInterface.SetStatusInfo(str); }),
new object[] { value }
);
}

}

/// <summary>
/// 关闭过渡窗口
/// </summary>
public static void Close()
{
if (m_SplashThread == null || m_SplashForm == null) return;

try
{
m_SplashForm.Invoke(new MethodInvoker(m_SplashForm.Close));
}
catch (Exception)
{
}
m_SplashThread = null;
m_SplashForm = null;
}

private static void CreateInstance(Type FormType)
{
object obj = FormType.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
m_SplashForm = obj as Form;
m_SplashInterface = obj as ISplashForm;
if (m_SplashForm == null || m_SplashInterface == null)
{
throw (new Exception());
}
if (!string.IsNullOrEmpty(m_TempStatus))
m_SplashInterface.SetStatusInfo(m_TempStatus);
}
private delegate void SplashStatusChangedHandle(string NewStatusInfo);
}

调用实例:
加一窗口:public class Form1 :Form,ISplashForm{
public Form1();
}

//==========================


//调用:
Splasher.Show(typeof(Form1));
//设置状态:
Splasher.Status="……";
Thread.Sleep(500);
//关闭:
Splasher.Close();
//:)
zhulei2008 2007-03-20
  • 打赏
  • 举报
回复
不知道楼主是想在BS上还是CS上实现???
CS上有个进度条的控件.
BS上找个图片过渡下就行了
j_lei407 2007-03-20
  • 打赏
  • 举报
回复
mark
gui0605 2007-03-20
  • 打赏
  • 举报
回复
没有百分百的准确,只能是大概估计
honkerhero 2007-03-20
  • 打赏
  • 举报
回复
UP,拉个进度条,估个数据赋上,隔时间变值,推进一下事件处理就行了
weiyong922 2007-03-20
  • 打赏
  • 举报
回复
up
kissknife 2007-03-20
  • 打赏
  • 举报
回复
其实LZ的主要问题应该是如何才能知道1,2两个操作各自执行时间,或者它们的比例。

对于“1、更新本地数据库。”还有可能比较准确地知道进度,
对于“2、打开主窗体,并关掉登录窗体。”应该没有办法

要在一个进度条里显示1,2的进度,简单的作法是,用1/2来表示第一步操作,第剩下的1/2来表示第二步操作,或者其他比例。

很多软件都是这样的,你比如“瑞星”升级时的进度窗口,也是分割成一部分一部分显示的,
所以进度条某一段慢某一段快..

其实进度条也不需要很准确,都是“骗人”的..

《仅供参考..
灰太狼 2007-03-20
  • 打赏
  • 举报
回复
to 我就是想知道如何比较准确地控制ProgressBar的刻度.

这个不太可能,因为无法知道准确的时间,只能是大概估计一下。
九章落地 2007-03-20
  • 打赏
  • 举报
回复
设置ProgressBar的Style属性为Marquee,这种方式行不通,因为我们这边用的都是Windows 2000系统,不支持此效果.

我是通过取远程数据库的数据来更新本地数据库,所以量大时速度比较慢,我就是想知道如何比较准确地控制ProgressBar的刻度.

真的没有好法子吗?
ms44 2007-03-20
  • 打赏
  • 举报
回复
使用BackGroundworker可能会比较好。
其中它有一个代表当前进度的属性, 这样就可以很好的让用户知道确切的进度。
hertcloud 2007-03-20
  • 打赏
  • 举报
回复
具体的时间
无法算出来的

楼主可以 直接用一个窗体上 显示一个ProgressBar,设置Style=Marquee就是了
如果需要 楼主 也可以
show个窗体 显示 一个gif动画条...

burn3tt 2007-03-20
  • 打赏
  • 举报
回复
其实查询状态并不是可以在查询进行中知道的,楼主可以测试一下本机查询百万条记录的时间,相除一下,得出查询一条记录时间。然后在查询之前得出待查询的条数,两者相乘大体就是总运行时间。
其实可以按照二楼说的办法,做一个假的就行,因为本地登录的话,速度应该很快,一闪就过去了
wzq6511 2007-03-20
  • 打赏
  • 举报
回复
up
Fan52027 2007-03-19
  • 打赏
  • 举报
回复
按照楼主的情况,基本可以不永多线程,加个ProgressBar,设置Style=Marquee;假的进度条好啦

110,538

社区成员

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

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

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