for (i = 1; i <= num; i++)
 {
       窗体中控件显示语句1       for (int j = 1; j <= ntime; j++)
       {
           SetProgress1(ntime, ntime - j);
           SetProgress2(ntime, j);
           Thread.Sleep(500);
       }
         
       窗体中控件显示语句2
 }
这是主线程中的代码,问题是上下两个窗体中控件显示的语句不起作用,控件中的值不能循环改变,只是开始的时候控件显示语句1的显示效果,然后是num轮的进度条改变(进度条用委托,显示正常),最后才是现实的控件显示语句2的显示效果。是什么原因啊?要实现上下两个控件显示语句的效果循环改变应该怎么控制线程呢?

解决方案 »

  1.   


    //form1.csprivate void button2_Click(object sender, EventArgs e)    //开始执行按钮
            {
                progressBar1.Visible = true;
                progressBar2.Visible = true;            Pcb pcb1 = new Pcb();
                pcb1 = myPcb.head;            int i, k;
                for (i = 1; i <= num; i++)    //num是进程个数
                {
                    ntime = pcb1.needtime;
                    textBox5.Text = ntime.ToString();
                    textBox6.Text = ntime.ToString();
                    textBox7.Text = pcb1.prio.ToString();
                    textBox8.Text = pcb1.name;                ////////////////////////////////////////////////////////////显示listview1
                    listView1.Items.Clear();
                    Pcb tempPcb = new Pcb();
                    tempPcb = pcb1.next;                ListViewItem lvi;                for (k = 0; k < num - i; k++)
                    {
                        lvi = new ListViewItem();
                        lvi.SubItems[0].Text = tempPcb.name;
                        lvi.SubItems.Add(tempPcb.cputime.ToString());
                        lvi.SubItems.Add(tempPcb.needtime.ToString());
                        lvi.SubItems.Add(tempPcb.prio.ToString());
                        lvi.SubItems.Add("W");
                        listView1.Items.Add(lvi);                    tempPcb = tempPcb.next;
                    }
                    /////////////////////////////////////////////////////////////                for (int j = 1; j <= ntime; j++)     //进度条显示,ntime为进程执行需要的时间片
                    {
                        SetProgress1(ntime, ntime - j);
                        SetProgress2(ntime, j);
                        Thread.Sleep(500);     //每隔500毫秒进度条改变一次
                    } 
           
                    //显示listview2
                    lvi = new ListViewItem();
                    lvi.SubItems[0].Text = pcb1.name;
                    lvi.SubItems.Add(pcb1.needtime.ToString());
                    lvi.SubItems.Add(pcb1.needtime.ToString());
                    lvi.SubItems.Add(pcb1.prio.ToString());
                    lvi.SubItems.Add("F");
                    listView2.Items.Add(lvi);                pcb1 = pcb1.next;
                }
            }        public delegate void dSetProgress(int total, int current);    //改变进度条的委托方法        public void SetProgress1(int total, int current)     
            {
                if (this.InvokeRequired)
                {
                    try
                    {
                        this.Invoke(new dSetProgress(this.SetProgress1), new object[] { total, current });
                    }
                    catch
                    { }
                }
                else
                {
                    this.progressBar1.Maximum = total;
                    this.progressBar1.Value = current;
                }
            }        public void SetProgress2(int total, int current)
            {
                if (this.InvokeRequired)
                {
                    try
                    {
                        this.Invoke(new dSetProgress(this.SetProgress2), new object[] { total, current });
                    }
                    catch
                    { }
                }
                else
                {
                    this.progressBar2.Maximum = total;
                    this.progressBar2.Value = current;
                }
            }
    以上是我按钮事件里的代码,我原来的目的是在listview1里显示当前就绪进程列表,listview2里显示当前完成进程列表,另一块由textbox和进度条组成显示当前正在运行的进程,根据进程需要的时间片控制进度条的显示,显示完后一个进程运行完毕,更新listview1和listview2的内容,取下一个进程运行。
    现在的问题是程序运行后listview1显示当前所有进程信息,然后进度条一直在走,一直到所有进程运行完后,listview2和textbox中才显示出运行完后应该显示的信息。为什么中间过程中listview1和listview2都不变呢?textbox中也不显示内容,应该怎么做啊?