日期:2014-05-18  浏览次数:21249 次

请教一个简单问题(多线程的)
先说一下我的问题:主要就是想实现(winform中)
1.在时钟里更新数组,
2.在一个线程中利用这个数组的值画出曲线。
下面是我写的程序,图就画了一次不知道怎么回事?请高手指教。。。。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication3
{
  public partial class Form1 : Form
  {
  static int[] a = new int[10];
  static int[] b = new int[10];
  static int count = 0;
  Object obj = new Object();//
  public Form1()
  {
  InitializeComponent();
  }
  private void draw()
  {
  Graphics g = pictureBox1.CreateGraphics();
  Pen pen1 = new Pen(Color.Red, 2);
  g.Clear(Color.White);
  lock (a)
  {
  for (int i = 0; i < 9; i++) 
  g.DrawLine(pen1, a[i], b[i], a[i + 1], b[i + 1]);
  }
  }
  private void timer1_Tick(object sender, EventArgs e)
  {
  lock (a)
  {
  for (int i = 0; i < 10; i++)
  {
  a[i] = (50 + count * 10) * i;
  if (i % 2 == 0) b[i] = 30;
  else b[i] = 50;
  }
  if (count < 10) count++; 
  else count = 0;
  }
   
  }
  private void Form1_Load(object sender, EventArgs e)
  {
  for (int i = 0; i < 10; i++) 
  {
  a[i] = 50 * i;
  if (i % 2 == 0)b[i] = 30;
  else b[i] = 50;
  }
   
  }

  private void button1_Click(object sender, EventArgs e)
  {
  ThreadStart ts = new ThreadStart(draw);
  Thread thread = new Thread(ts);
  thread.Start();
  timer1.Enabled = true;
  }
  }
}

------解决方案--------------------
哦,你是要线程间隔自动执行?那就把调用线程放在时钟里面就可以了。
private void timer1_Tick(object sender, EventArgs e)
{
lock (a)
{
for (int i = 0; i < 10; i++)
{
a[i] = (50 + count * 10) * i;
if (i % 2 == 0) b[i] = 30;
else b[i] = 50;
}
if (count < 10) count++;
else count = 0;
button1_Click(null,null);
}
------解决方案--------------------
要看效果就这样,但这觉不是什么合理的设计
C# code
private void draw()
{
    Pen pen1 = new Pen(Color.Red, 2);
    while (true)
    {
        Graphics g = pictureBox1.CreateGraphics();
        g.Clear(Color.White);
        lock (a)
        {
            for (int i = 0; i < 9; i++)
                g.DrawLine(pen1, a[i], b[i], a[i + 1], b[i + 1]);
        }
        g.Dispose();
        Thread.Sleep(100);
    }
}

------解决方案--------------------
1.lock 关键字哪儿修改一下 lock(obj)
2.再用一个timer 专门负责取数组值更新绘图 你使用thread.start 无法满足你提供的需求一个线程修改一个线程绘图(不间断的) 因为start只会执行一次 
多线程数据块共享 关键还是在于怎么使用锁机制