1。创建一个Winform程序,以随即方式显示移动的“好好学习”,“天天向上”信息。要求两行文本的移动不分先后,单独移动2.设计一个Winform程序,从1加到1 000 000,用三个线程分段计算,累加和用一个变量表示,利用lock语句的锁定机制实现该功能。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace WinformPro2012_2_20.Chapter8
{
    public partial class frmLock : Form
    {
        int sum;//保存累加的和    
        string txt = "1+2+3+...+1000000";
        delegate void AddCallListBack(string text);
        public frmLock()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            Thread t1 = new Thread(new ThreadStart(Calculate));
            Thread t2 = new Thread(new ThreadStart(Calculate));
            Thread t3 = new Thread(new ThreadStart(Calculate));
            t1.Start();
            t2.Start();
            t3.Start();        }
        private void Calculate()
        {
            lock (this)
            {
                for (int i = 1; i < 1000001; i++)
                {
                    sum += i;
                }
                Start(string.Format("{0}={1}", txt, sum.ToString()));
            }
        }
        private void Start(string text)
        {
            if (listBox1.InvokeRequired)
            {
                AddCallListBack add = new AddCallListBack(Start);
                this.Invoke(add, new object[] { text });
            }
            else
                listBox1.Items.Add(text);        }
    }
}
第二题没有达到要求,不知道该怎么办了。

解决方案 »

  1.   

    1。创建一个Winform程序,以随即方式显示移动的“好好学习”,“天天向上”信息。要求两行文本的移动不分先后,单独移动
     
    新建一个label,用来显示信息
    定义两个随机数x和y,一个从0到formName.Height-lbl.Height,一个从0到formName.Width-lbl.Width,分别用来定义label的Location.X和Location.Y
    新建一个Timer,窗体初始化时设置为启用,Interval设置为1000(1秒)
    在Timer的Ticker事件中重定向label的Location
    lbl.Location = new Point(x,y);
      

  2.   

    这样行不行?
    public partial class Form1 : Form
        {
            private long sum;
            private static readonly object obj = new object();        public Form1()
            {
                InitializeComponent();
                settext += new settexthandle( Form1_settext );
                setbtnText += new setbuttonTextHandle( Form1_setbtnText );
            }        void Form1_setbtnText( string s )
            {
                button1.Text = s;
            }        void Form1_settext( string s )
            {
                button1.Invoke( setbtnText , s );
            }        private delegate void settexthandle( string s );
            private event settexthandle settext;        private delegate void setbuttonTextHandle( string s );
            private event setbuttonTextHandle setbtnText;
            private void button1_Click( object sender , EventArgs e )
            {
                sum = 0;
                Thread th1 = new Thread( new ThreadStart( loop1 ) );
                Thread th2 = new Thread( new ThreadStart( loop2 ) );
                Thread th3 = new Thread( new ThreadStart( loop3 ) );
                th1.Start();
                th2.Start();
                th3.Start();
            }        private void AddSum( long num )
            {
                lock ( obj )
                {
                    sum = sum + num;
                    settext( sum.ToString() );
                }
            }        private void loop1()
            {
                for ( int i = 1; i <= 1000000; i++ )
                {
                    AddSum( i );
                }
            }        private void loop2()
            {
                for ( int i = 2000001; i <= 3000000; i++ )
                {
                    AddSum( i );
                }
            }        private void loop3()
            {
                for ( int i = 3000001; i <= 4000000; i++ )
                {
                    AddSum( i );
                }
            }
        }
      

  3.   

    要求两行文本的移动不分先后,单独移动没明白是什么意思,是两个label吗
      

  4.   

    第一个的话  添加两个label  再添加一个或者两个timer进行控制  直接用坐标的方式就行了
      

  5.   

    第一个问题 timer 放多个lable。。 移动效果 用lable间的相互隐藏和显示实现嘎嘎貌似方法有点过于那个我承认我是来打酱油的。。
      

  6.   

    哦也  lock (sum )没用过  学习中
      

  7.   


    不可以用,不要用 不可以 lock int
      

  8.   

    第二个题纳闷怎么用lock,要用lock锁住计算变量那不没意义了么?锁住线程?也没跨线程啊。想不明白,求指点
      

  9.   


    前几天做个愚人节整人程序 上面就有lable 的移动 就是配合timer控件改变坐标位置就好了
    看这里
      

  10.   

    同意  可以lock int 但就沒什麼意思了,一般都是lock 非值類型
      

  11.   

    对,不可以用lock(int) 必须为方法
      

  12.   

    public partial class Form1 : Form
        {        public Form1()
            {
                InitializeComponent();
            }
            delegate void SetLablePositionEventHandle(Label lable, Point p);
            private void SetLablePosition(Label lable, Point p)
            {
                if (this.InvokeRequired)
                {
                    SetLablePositionEventHandle handle = new SetLablePositionEventHandle(SetLablePosition);
                    this.Invoke(handle, new object[] { lable, p });
                }
                else
                {
                    lable.Location = p;
                }
            }
            private Thread thread1;
            private Thread thread2;
            private bool thread1End = false;
            private bool thread2End = false;
            private void Form1_Load(object sender, EventArgs e)
            {
                thread1 = new Thread(new ThreadStart(Start1));
                thread2 = new Thread(new ThreadStart(Start2));
                Random rand = new Random();
                int rate = rand.Next(0, 10);
                if (rate <= 5)
                {
                    thread1.Start();
                    thread2.Start();
                }
                else
                {
                    thread2.Start();
                    thread1.Start();
                }
            }        private void Start1() 
            {
                while (!thread1End)
                {
                    Random rand = new Random();
                    int rate = rand.Next(0, 100);
                    int x = (int)(this.ClientSize.Width * ((double)rate / 100.00));
                    int y = (int)(this.ClientSize.Height * ((double)rate / 100.00));
                    Point p = new Point(x, y);
                    SetLablePosition(label1,p);
                    Thread.Sleep(700);
                }
                thread1.Abort();
                return;
            }        private void Start2() 
            {
                while (!thread2End)
                {
                    Random rand = new Random();
                    int rate = rand.Next(0, 100);
                    int x = (int)(this.ClientSize.Width * ((double)rate / 100.00));
                    int y = (int)(this.ClientSize.Height * ((double)rate / 100.00));
                    Point p = new Point(x, y);
                    SetLablePosition(label2, p);
                    Thread.Sleep(1000);
                }
                thread2.Abort();
                return;
            }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                thread1End = true;
                thread2End = true;
            }
        }