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

有关线线程返回值设定
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 BitmapTrans
{
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  pictureBox1.Image = Bitmap.FromFile("3.jpg");
  }

  private void button1_Click(object sender, EventArgs e)
  {
  Tool tool = new Tool(new Bitmap("3.jpg"));
  Thread trans = new Thread(new ThreadStart(tool.ConvertToGrayscale));
  trans.Start();
  trans.Join();
  pictureBox1.Image = tool.BitmapPic;
  }

  }

  class Tool
  {
  private Bitmap btpic;
  public Tool(Bitmap bt)
  {
  btpic = bt;
  }
   
  public void ConvertToGrayscale()
  {

  Bitmap bm = new Bitmap(btpic.Width, btpic.Height);
  for (int y = 0; y < bm.Height; y++)
  {
  for (int x = 0; x < bm.Width; x++)
  {
  Color c = btpic.GetPixel(x, y);
  int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
  bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
  }
  }
  btpic = bm;
  }

  public Bitmap BitmapPic
  {
  get
  {
  return btpic;
  }
  }
  }
}

上面是代码,很简单,我只是想把一张图片从彩色的转成黑白的,但是我的转化方法比较浪费时间(尤其是对大图像),如果不用线程去做的话,那在转化的过程中前台Form这个线程就会死掉片刻,当然这是很正常的。在这里为了保证前台GUI线程的正常运行,所以我想用线程来转化图像。
但是现在就出现这样一个问题,大家可能看到我在启动线程后调用了Join方法,是为了等线程结束,我可以将转化过后的Bitmap对象显示出来,但是这样的等侍依然中止了当前Form的线程,使Form不能做任何响应,我现在想问一下有没有方法让Form这个前台线程不中止在这里,可以继续做自己的事,而当转化线程完成自己的事后,可以发了类似中断的事件告诉前台Form线程转化已经完成,可以来获取转化结果了!

------解决方案--------------------
定义一个全局委托事件,线程处理完了以后,触发一下就ok了