首页 新闻 会员 周边

跨线程操作progressbar遇到的问题求解

0
悬赏园豆:20 [已关闭问题]

主form的load时间有点长,所以想增加一个progressbar来表示当前主程序运行状况。而progressbar在主程序打开之前需要一直左右移动进度条。目前遇到的问题是这样的:

因为需要一直左右移动,且不能影响主程序的启动,所以必须用另一个线程来工作。

因为主form没有load出来,所以progressbar不能放在主form中。否则会引起跨线程invoke的时候会提示句柄不存在。所以我新建了一个form,将进度条放在另一个form中。另一个form在主form的构造函数中可以初始化,并show()出来。此处运用show其实也是一个多线程问题,为的是新诞生的form不影响主程序的启动问题。于是我在新诞生的form中增加了一个progressbar,因为progressbar要一直运行,所以此处我在新的form中也增加了一个子线程,由子线程来实现progressbar的进度条改变问题。

当主程序代开后,将会调用一个函数将新form关闭并dispose()。本来觉得这样虽然思路有点乱,但没有逻辑问题,谁知道最后运行结果是:新的form出来了,也会自动关闭,但上面的progressbar完全无视程序运行的存在,从头到尾就没工作过。我很想知道我到底犯了什么错。

此处我也试验了将那个子线程放在主form的load中,然而结果还是让我郁闷。与上面效果一样。

下面我的一些代码:

新form:

   public partial class WaitForm : Form
    {
        Thread th;
        public delegate void dd();

        public WaitForm()
        {
            InitializeComponent();
        }

        private void WaitForm_Load(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;
            progressBar1.BackColor = Color.Green;

            th.IsBackground = true;
        }
        void ProgressAct()
        {
            dd dt = delegate()
            {
                for (int i = 0; ; i++)
                {
                    if ((i / 5) % 2 == 0)
                    {
                        Thread.Sleep(1000);
                        progressBar1.Step = 2;
                        progressBar1.PerformStep();
                    }
                    else
                    {
                        Thread.Sleep(1000);
                        progressBar1.Step = -2;
                        progressBar1.PerformStep();
                    }
                }
            };
            this.progressBar1.Invoke(dt);
            Thread.Sleep(1000);

        }

    }

 

主form相关代码:

public partial class Form1 : Form
    {
        WaitForm wf;

public Form1()
        {
            InitializeComponent();

            wf = new WaitForm();
            wf.Show();
        }

 private void Form1_Load(object sender, EventArgs e)
        {

                   。。。。。。。。。

        }

大虾们,帮帮忙啊

BLoodMaster的主页 BLoodMaster | 初学一级 | 园豆:135
提问于:2010-03-04 16:46
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册