有关线线程返回值设定
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了