主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)
{
。。。。。。。。。
}
大虾们,帮帮忙啊