回 帖 发 新 帖 刷新版面

主题:线程问题

使用六个线程分别来同时显示六个随机数字。当判断六个随机数有任意两个相等时,线程重新循环进行,直到没相等时停止。在这中间有时候会出现个问题,就是有某些线程来不及资源回收导致原先线程没关掉新的线程又开始,请问有没有解决方法。以下是代码,请高手指点下。
        // 开始摇号
        private void label1_MouseClick(object sender, MouseEventArgs e)
        {

            Start();
            this.label1.Visible = false;
            this.label2.Visible = true;     
        }

        // 开启六个线程,来进行摇号
        private void Start()
        {
            this.result.Visible = false;

            TransBall ball1 = new TransBall(number1, 100);
            thread1 = new Thread(new ThreadStart(ball1.RunInThread));
            thread1.Start();

            TransBall ball2 = new TransBall(number2, 200);
            thread2 = new Thread(new ThreadStart(ball2.RunInThread));
            thread2.Start();

            TransBall ball3 = new TransBall(number3, 300);
            thread3 = new Thread(new ThreadStart(ball3.RunInThread));
            thread3.Start();

            TransBall ball4 = new TransBall(number4, 400);
            thread4 = new Thread(new ThreadStart(ball4.RunInThread));
            thread4.Start();

            TransBall ball5 = new TransBall(number5, 500);
            thread5 = new Thread(new ThreadStart(ball5.RunInThread));
            thread5.Start();

            TransBall ball6 = new TransBall(number6, 600);
            thread6 = new Thread(new ThreadStart(ball6.RunInThread));
            thread6.Start();
        }

        // 结束线程
        private void End()
        {
            try
            {
                thread1.Abort();
                thread2.Abort();
                thread3.Abort();
                thread4.Abort();
                thread5.Abort();
                thread6.Abort();
            }
            catch
            {
            }
            finally
            {
                thread1 = null;
                thread2 = null;
                thread3 = null;
                thread4 = null;
                thread5 = null;
                thread6 = null;
            }
        }

        // 结束摇号
        private void label2_Click(object sender, EventArgs e)
        {
            End();
            this.label2.Visible = false;
            // 各个数之间不能相等,当再调用Start(),End()的时候由于滞后原因会出现线程资源来不及回收导致错误,解决方法?
            try
            {
                while (!(number1.Text != number2.Text && number1.Text != number3.Text && number1.Text != number4.Text &&
                number1.Text != number5.Text && number1.Text != number6.Text && number2.Text != number3.Text &&
                number2.Text != number4.Text && number2.Text != number5.Text && number2.Text != number6.Text &&
                number3.Text != number4.Text && number3.Text != number5.Text && number3.Text != number6.Text &&
                number4.Text != number5.Text && number4.Text != number6.Text && number5.Text != number6.Text))
                {
                    Start();
                    End();
                }

            }
            catch
            {
            }

            this.label1.Visible = true;

            Array numbers = Array.CreateInstance(typeof(string), 6);
            numbers.SetValue(number1.Text, 0);
            numbers.SetValue(number2.Text, 1);
            numbers.SetValue(number3.Text, 2);
            numbers.SetValue(number4.Text, 3);
            numbers.SetValue(number5.Text, 4);
            numbers.SetValue(number6.Text, 5);

            // 调用数组的排序方法对六个数进行排序
            Array.Sort(numbers);
            this.result.Text = "中奖号码: " + numbers.GetValue(0).ToString() + "+" + numbers.GetValue(1).ToString() +
                "+" + numbers.GetValue(2).ToString() + "+" + numbers.GetValue(3).ToString() + "+" + numbers.GetValue(4).ToString() +
                "+" + numbers.GetValue(5).ToString();


            this.result.Visible = true;

        }

    class TransBall
    {
        private Control objControl;
        private int iSeed;

        public TransBall(Control control, int seed)
        {
            objControl = control;
            iSeed = seed;
        }

        public void RunInThread()
        {
            // 采用时间来作为种子
            int time = DateTime.Now.Minute + DateTime.Now.Second + DateTime.Now.Millisecond;
            Random rdm1 = new Random(time + iSeed);
            //Random rdm1 = new Random(unchecked((int)DateTime.Now.Ticks + iSeed));
            //MessageBox.Show((unchecked((int)DateTime.Now.Ticks).ToString()));
            do
            {
                int number = rdm1.Next(1, 30);
                if (number < 10)
                {
                    objControl.Text = "0" + number.ToString();
                }
                else
                {
                    objControl.Text = number.ToString();
                }
                Thread.Sleep(10);
            } while (true);
        }
    }

此帖转自:[url]http://www.programfan.com/team/team.asp?team_id=1389[/url]

回复列表 (共1个回复)

沙发

线程太多,并且处理同一问题,协调起来的确很麻烦
多用全局变量吧,直接用Control.Text作为中间变量也不是很妥当

另外,针对这个案例,其实可以用一个线程依次随机出每位的值,效率资源上不更优?

我来回复

您尚未登录,请登录后再回复。点此登录或注册