我现在做一个登录窗体,点击登录按钮后执行下面动作:
1、更新本地数据库。
2、打开主窗体,并关掉登录窗体。因为执行时间有点长,我想加入一个进度条。
小弟对多线程编程一知半解,在BackgroudWorker的DoWork事件里,如何计算动作执行完成的百分比呢?如何得到窗体的Show方法所用的时间呢?虚心向各位高手请教,谢谢!

解决方案 »

  1.   

    按照楼主的情况,基本可以不永多线程,加个ProgressBar,设置Style=Marquee;假的进度条好啦
      

  2.   

    //你测试一下下面这个代码。
        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();
    //:)
      

  3.   

    具体的时间
    无法算出来的楼主可以 直接用一个窗体上 显示一个ProgressBar,设置Style=Marquee就是了
    如果需要 楼主 也可以
    show个窗体 显示 一个gif动画条...
      

  4.   

    使用BackGroundworker可能会比较好。
    其中它有一个代表当前进度的属性, 这样就可以很好的让用户知道确切的进度。
      

  5.   

    设置ProgressBar的Style属性为Marquee,这种方式行不通,因为我们这边用的都是Windows 2000系统,不支持此效果.我是通过取远程数据库的数据来更新本地数据库,所以量大时速度比较慢,我就是想知道如何比较准确地控制ProgressBar的刻度.真的没有好法子吗?
      

  6.   

    to 我就是想知道如何比较准确地控制ProgressBar的刻度.这个不太可能,因为无法知道准确的时间,只能是大概估计一下。
      

  7.   

    不知道楼主是想在BS上还是CS上实现???
    CS上有个进度条的控件.
    BS上找个图片过渡下就行了