This is simple multi-threading program that draws circles and rectangles. Each shape is handle by individual thread that created every time you press start button. Using sleep method on each thread we can change the speed of each shape.

I have used to implement this program. Double click on Thread_Example.Zip and extract all the files and folders to a folder in C drive.






其中,基类Shapes.cs:
代码如下:

None.gifusing System;
None.gifusing System.Drawing;
None.gifusing System.Threading;
None.gif
None.gif
None.gif
None.gifnamespace ThreadTester
ExpandedBlockStart.gifContractedBlock.gifDrawing Shapes using Threading_全局变量_11{
InBlock.gif    public abstract class Shapes
ExpandedSubBlockStart.gifContractedSubBlock.gif    Drawing Shapes using Threading_全局变量_11{
InBlock.gif        protected int  xVal;
InBlock.gif        protected int yVal;
InBlock.gif        protected Color color;
InBlock.gif        protected int width; 
InBlock.gif        protected int height;
InBlock.gif        protected int directionY = 1;
InBlock.gif        protected int directionX = 1;
InBlock.gif        protected Form1 frm1;
InBlock.gif        protected int speed;
InBlock.gif            
InBlock.gif        public Shapes()
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{  }
InBlock.gif
InBlock.gif        public abstract void paint(Graphics g);
InBlock.gif            
InBlock.gif        public void CheckCoordinates()
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{
InBlock.gif            if((frm1.panel1.Size.Height-20 < yVal) || (yVal <= 0))
InBlock.gif                directionY = directionY * (-1);    
InBlock.gif
InBlock.gif            if((frm1.panel1.Size.Width-20 < xVal) || (xVal <= 0))
InBlock.gif                directionX = directionX * (-1);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
None.gif

继承Shapes的2个继承类:Rectangle和Circle类定义如下:

None.gifusing System;
None.gifusing System.Drawing;
None.gifusing System.Threading;
None.gif
None.gif
None.gif
None.gifnamespace ThreadTester
ExpandedBlockStart.gifContractedBlock.gifDrawing Shapes using Threading_全局变量_11{
InBlock.gif    public class Rectangle : Shapes
ExpandedSubBlockStart.gifContractedSubBlock.gif    Drawing Shapes using Threading_全局变量_11{
InBlock.gif        public Rectangle(int x,int y,int w,int h, Color c,Form1 f,int spd)
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{ xVal = x; yVal = y; color = c; width = w; height = h;    frm1 = f; speed = spd;}
InBlock.gif                
InBlock.gif        public override void  paint(Graphics g)
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{    
InBlock.gif            try
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{
InBlock.gif                Thread.Sleep(speed);
InBlock.gif                g.DrawRectangle(new System.Drawing.Pen(frm1.BackColor),xVal,yVal,width,height);
InBlock.gif                lock(typeof(Thread))
ExpandedSubBlockStart.gifContractedSubBlock.gif                Drawing Shapes using Threading_全局变量_11{
InBlock.gif                        xVal = xVal+ base.directionX; 
InBlock.gif                    yVal = yVal+ base.directionY;
InBlock.gif                    base.CheckCoordinates();
ExpandedSubBlockEnd.gif                }
InBlock.gif                g.DrawRectangle(new System.Drawing.Pen(color),xVal,yVal,width,height); 
ExpandedSubBlockEnd.gif            }
InBlock.gif            catch
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{}
InBlock.gif            
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif        
None.gif
None.gif
None.gif

None.gif
None.gifusing System;
None.gifusing System.Drawing;
None.gifusing System.Threading;
None.gif
None.gif
None.gif
None.gifnamespace ThreadTester
ExpandedBlockStart.gifContractedBlock.gifDrawing Shapes using Threading_全局变量_11{
InBlock.gif    public class Circle : Shapes
ExpandedSubBlockStart.gifContractedSubBlock.gif    Drawing Shapes using Threading_全局变量_11{
InBlock.gif        public Circle(int x,int y,int w,int h, Color c, Form1 f, int spd)
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{ xVal = x; yVal = y; color = c; width = w; height = h;    frm1 = f; speed = spd;}
InBlock.gif
InBlock.gif                        
InBlock.gif        public override void  paint(Graphics g)
ExpandedSubBlockStart.gifContractedSubBlock.gif        Drawing Shapes using Threading_全局变量_11{    
InBlock.gif            try
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{
InBlock.gif                Thread.Sleep(speed);
InBlock.gif                g.DrawEllipse(new System.Drawing.Pen(frm1.BackColor),xVal,yVal,width,height); 
InBlock.gif                        
InBlock.gif                lock(typeof(Thread))
ExpandedSubBlockStart.gifContractedSubBlock.gif                Drawing Shapes using Threading_全局变量_11{
InBlock.gif                    xVal = xVal+ base.directionX; 
InBlock.gif                    yVal = yVal+ base.directionY;
InBlock.gif                    base.CheckCoordinates();
ExpandedSubBlockEnd.gif                }
InBlock.gif                g.DrawEllipse(new System.Drawing.Pen(color),xVal,yVal,width,height); 
ExpandedSubBlockEnd.gif            }
InBlock.gif            catch
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{    }        
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gif


主界面如下:

全局变量定义如下:

None.gifpublic volatile Panel panel1;
None.gif        public static Color shapeColor = Color.Blue;
None.gif        public ColorDialog c;
None.gif        public static int threadCount = 0;
None.gif        private Hashtable threadHolder = new Hashtable();
None.gif        private const int shapSize = 15; 
None.gif        private volatile Graphics g;
None.gif        

注意其中的:

None.gif        private volatile Graphics g;
None.gif        public volatile Panel panel1;

退出部分代码如下:

None.gif    private void cmdExit_Click(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        Drawing Shapes using Threading_全局变量_11{
ExpandedSubBlockStart.gifContractedSubBlock.gif            /**//* Abort all the threads that are currently alive */
InBlock.gif            foreach(Thread t in threadHolder.Values)
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{
InBlock.gif                    if(t != null && t.IsAlive)
InBlock.gif                   t.Abort();
ExpandedSubBlockEnd.gif            }
InBlock.gif            Form1.ActiveForm.Close();    
ExpandedBlockEnd.gif        }
选择颜色代码:
None.gif    private void cmdColor_Click(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        Drawing Shapes using Threading_全局变量_11{
InBlock.gif            c = new ColorDialog();
InBlock.gif            c.ShowDialog();
InBlock.gif            shapeColor = c.Color;
ExpandedBlockEnd.gif        }
None.gif

开始按钮代码 如下:
None.gif    private void cmdStart_Click(object sender, System.EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        Drawing Shapes using Threading_全局变量_11{
InBlock.gif            Thread t = new Thread(new ThreadStart(StartThread));
InBlock.gif            threadHolder.Add(threadCount++,t);
ExpandedSubBlockStart.gifContractedSubBlock.gif            /**//* Assign a name for each thread (but it's not necessary) */
InBlock.gif             = "Thread ID: "+threadCount;
InBlock.gif            t.IsBackground  = true;
InBlock.gif            t.Start();
ExpandedBlockEnd.gif        }
None.gif        

当中对线程的定义部分如下:
None.gif    private void StartThread()
ExpandedBlockStart.gifContractedBlock.gif        Drawing Shapes using Threading_全局变量_11{
ExpandedSubBlockStart.gifContractedSubBlock.gif            /**//* Create the shape object */
InBlock.gif            Shapes shapes;
InBlock.gif            if(comboBox1.Text.Equals("Rectangle"))
InBlock.gif                shapes =  new Rectangle(0,0,shapSize,shapSize,shapeColor,this,Convert.ToInt32(comboBoxSpeed.Text.Trim()));
InBlock.gif            else if(comboBox1.Text.Equals("Circle"))
InBlock.gif                shapes =  new Circle(0,0,shapSize,shapSize,shapeColor,this,Convert.ToInt32(comboBoxSpeed.Text.Trim())); 
ExpandedSubBlockStart.gifContractedSubBlock.gif                /**//**The line below is not necessary , but if you want to add more shapes this will help*/
InBlock.gif            else
InBlock.gif                shapes =  new Rectangle(0,0,shapSize,shapSize,shapeColor,this,Convert.ToInt32(comboBoxSpeed.Text.Trim()));
InBlock.gif        
InBlock.gif            while(true)
ExpandedSubBlockStart.gifContractedSubBlock.gif            Drawing Shapes using Threading_全局变量_11{
InBlock.gif                    try
ExpandedSubBlockStart.gifContractedSubBlock.gif                Drawing Shapes using Threading_全局变量_11{ shapes.paint(g);     }
InBlock.gif                    
InBlock.gif                catch(Exception e1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                Drawing Shapes using Threading_全局变量_11{
InBlock.gif                        Console.WriteLine("Exception in Form1 whileloop >> "+e1);
InBlock.gif                    break;     
ExpandedSubBlockEnd.gif                }
ExpandedSubBlockEnd.gif            }
ExpandedBlockEnd.gif        }