我定义了一个线程,目的是使用Thread.Sleep(int n)这个功能,然后就可以模仿直线的缓慢加长,程序如下:
private void button10_Click(object sender, EventArgs e)  //加工焰道
        {
            ThreadProcSafe();
            this.demoThread.Start();
        }        private void ThreadProcSafe()
        { 
            SetText(20);
        }        private void SetText(float NoNumber)
        {
            if (this.pictureBox1.InvokeRequired)   //控件的 Handle 是在与调用线程不同的线程上创建的
            {                                     //(说明您必须通过 Invoke 方法对控件进行调用),则为 true;否则为 false            
                SetTextCallback newInvoke = new SetTextCallback(SetText);    //产生delegate对象 
                this.Invoke(newInvoke, new Object[] { NoNumber });      //调用                
            }
            else
            {
                pictureBox1.Image = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
                Graphics g = Graphics.FromImage(pictureBox1.Image);
                g.Clear(SystemColors.ControlLightLight);
                Pen pen = new Pen(Color.Red,3);
                for (int i = 0; i < 5; i++)
                {
                    iCount = 0;                    [color=#FF0000]while (iCount < 120)
                    {
                        Thread.Sleep(100);
                        this.textBox1.Text = iCount.ToString();
                        g.DrawLine(pen, 20, 20, 50 + iCount, 50 + iCount);
                        iCount += 1;
                        pictureBox1.Refresh();
                    }       
     [/color]        
                }                    
                g.Dispose();
            }
        }        
红色部分的循环执行一次就不能继续下去了,程序进入死循环,不能正常关闭程序,后来我改了一点:
for (int i = 0; i < 5; i++)
                {
                    iCount = 0;                    [color=#FF0000]while (iCount < 120)
                    {
                        Thread.Sleep(100);
                        this.textBox1.Text = iCount.ToString();
                        [color=#FF00FF]g.DrawLine(pen, i*10+20, i*10+30, 50 + iCount, 50 + iCount);

                        iCount += 1;
                        pictureBox1.Refresh();
                    }       [/color]     [/color]
目的是有不同的起点。
但是这样的话直线并不是一条一条的显示,而是像区域一样,缓慢加大,然后有进入死循环了
这个问题好烦,我写了这么多,希望高手帮忙看看,给点意见,谢谢!

解决方案 »

  1.   

    this.demoThread.Start(); 
    这个线程在做什么啊!
    先帮你顶哈!
      

  2.   

    首先,你这不是一个线程,所以Sleep(100);系统就挂起了.我试了一下,在Thread.Sleep(100); 后面加上Application.DoEvents();就可以了.
    (2)你iCount++ 后,你的斜率变了,所以说不是一条直线慢慢往前画,而是画出了一片线段(不知这么说你明白没有)
    而i从0到5的象素变化你就看不出来了.
      

  3.   

    加上Application.DoEvents();之后的确是可以运行了,非常感谢wdgphc 的帮忙,但是有个奇怪的现象,是程序运行完一次循环后,可以按关闭线程那个键退出了,但是windows那里的线程确还没释放,请问为什么?
    补充一点,我上面程序的意思是循环画5条直线就可以了,但是程序的执行是连续做了两次循环,画完5条线后,又重新再画一次,想不明白?
      

  4.   

    this.demoThread.IsBackground = true; 【for 可以按关闭线程那个键退出了,但是windows那里的线程确还没释放】对于重新画的问题,能否贴能运行的代码出来看看?