// 封装2个属性的操作 ,label3和label5的Text属性表示文件的转换状态以及转换的进度,
我的意创建一个线程,然后运行相应的方法,显示文件转换的进图(X%)和正在转换的图片
public Label Label3
{
get { return this.label3; }
}
public Label Label5
{
get { return this.label5; }
}
// 是一个 ParameterizedThreadStart 类型委托调用的方法,表示正在转换的进度以及正在转换的图片的信息
private void RecState2(object obj)
{
ListViewItem lll = (ListViewItem)obj;
//--强转
this.label3.Text = "正在转换.." + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf("."));
this.label5.Text = Convert.ToString((this.progressBar1.Value / HowMuchItems) * 100) + "%"; } ///表示开始转换按钮
private void button_convery_Click(object sender, EventArgs e)
{
try
{ // 定义委托实例
ParameterizedThreadStart diaplaylabel = new ParameterizedThreadStart(RecState2);
// 建立线程实例
Thread labeldisplaythread = new Thread(diaplaylabel);
//引发线程
labeldisplaythread.Start();
foreach (ListViewItem lll in this.imagelist.Items)
{
imagegg = Image.FromFile(lll.SubItems[1].Text + @"\" + lll.SubItems[0].Text);
//--- 这里是转换格式的操作
//ICON部分代码已经无用
if (this.choseformat.SelectedItem.ToString() == "Icon")
{
imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @".ico", (ImageFormat)this.choseformat.SelectedItem);
}
else imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @"." + this.choseformat.SelectedItem.ToString(), (ImageFormat)this.choseformat.SelectedItem);
this.progressBar1.Value++;
// 这里是在一个Foreach循环中 激活方法,请看上面
this.RecState2((object)lll); }
//在循环完毕后,终止线程。。
labeldisplaythread.Abort();
if (this.progressBar1.Value == HowMuchItems)
MessageBox.Show("成功把" + HowMuchItems.ToString() + "个图像文件,转化成" + this.choseformat.SelectedItem.ToString() + "格式");
this.label3.Text = "转换成功"; } catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}/// 但是,一切都看着是那么的顺利,但是在我点击了转换按钮,就是执行了面的程序后,,这个程序整个退出了!!!
没有任何的征兆。。就直接退出了?搞不懂啊。再就是了,我调试的时候发现,是可以执行的(只是界面没有显示,)在 RecState2 方法里面设置断点,编译器和执行到了。。
但是为什么退出了???
大家,请来讨论一下
或是提一些有用的意见。。小弟不胜感激
我的意创建一个线程,然后运行相应的方法,显示文件转换的进图(X%)和正在转换的图片
public Label Label3
{
get { return this.label3; }
}
public Label Label5
{
get { return this.label5; }
}
// 是一个 ParameterizedThreadStart 类型委托调用的方法,表示正在转换的进度以及正在转换的图片的信息
private void RecState2(object obj)
{
ListViewItem lll = (ListViewItem)obj;
//--强转
this.label3.Text = "正在转换.." + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf("."));
this.label5.Text = Convert.ToString((this.progressBar1.Value / HowMuchItems) * 100) + "%"; } ///表示开始转换按钮
private void button_convery_Click(object sender, EventArgs e)
{
try
{ // 定义委托实例
ParameterizedThreadStart diaplaylabel = new ParameterizedThreadStart(RecState2);
// 建立线程实例
Thread labeldisplaythread = new Thread(diaplaylabel);
//引发线程
labeldisplaythread.Start();
foreach (ListViewItem lll in this.imagelist.Items)
{
imagegg = Image.FromFile(lll.SubItems[1].Text + @"\" + lll.SubItems[0].Text);
//--- 这里是转换格式的操作
//ICON部分代码已经无用
if (this.choseformat.SelectedItem.ToString() == "Icon")
{
imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @".ico", (ImageFormat)this.choseformat.SelectedItem);
}
else imagegg.Save(FolderPath + @"\" + lll.SubItems[0].Text.Substring(0, lll.SubItems[0].Text.LastIndexOf(".")) + @"." + this.choseformat.SelectedItem.ToString(), (ImageFormat)this.choseformat.SelectedItem);
this.progressBar1.Value++;
// 这里是在一个Foreach循环中 激活方法,请看上面
this.RecState2((object)lll); }
//在循环完毕后,终止线程。。
labeldisplaythread.Abort();
if (this.progressBar1.Value == HowMuchItems)
MessageBox.Show("成功把" + HowMuchItems.ToString() + "个图像文件,转化成" + this.choseformat.SelectedItem.ToString() + "格式");
this.label3.Text = "转换成功"; } catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}/// 但是,一切都看着是那么的顺利,但是在我点击了转换按钮,就是执行了面的程序后,,这个程序整个退出了!!!
没有任何的征兆。。就直接退出了?搞不懂啊。再就是了,我调试的时候发现,是可以执行的(只是界面没有显示,)在 RecState2 方法里面设置断点,编译器和执行到了。。
但是为什么退出了???
大家,请来讨论一下
或是提一些有用的意见。。小弟不胜感激
backgroundWorker
控件或窗体.Invoke((EventHandler)delegate
{
});
看看你的代码:try
{
ParameterizedThreadStart diaplaylabel = new ParameterizedThreadStart(RecState2);
Thread labeldisplaythread = new Thread(diaplaylabel);
labeldisplaythread.Start();
.......
labeldisplaythread.Abort();
}
catch(...)
{
}
这里不会出产生异常。labeldisplaythread.Start()代码一瞬间就执行完了,同时labeldisplaythread.Abort()也只是发一个消息给线程(也是一瞬间就执行完了),这两条语句并不会产生异常。结果就是,你的try...catch...根本没有写到你想捕获的那个异常的地方,所以它不会运行。