【发布时间】:2014-06-20 10:40:26
【问题描述】:
我在form1中有一个progressBar1和BackgroundWorker,当我点击按钮创建avi文件时,我希望它根据avi文件创建进度报告给progressBar。
这是我创建 avi 文件的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AviFile;
using System.Drawing;
using System.IO;
namespace WindowsFormsApplication1
{
class CreateAvi
{
public static void AviMovie(FileInfo[] FileNames)
{
Bitmap bitmap = (Bitmap)Image.FromFile(FileNames[0].FullName);
AviManager aviManager =
new AviManager(@"c:\temp\new.avi", false);
VideoStream aviStream =
aviManager.AddVideoStream(false, 25, bitmap);
int count = 0;
for (int n = 1; n < FileNames.Length; n++)
{
if (FileNames[n].Length > 0)
{
bitmap =
(Bitmap)Bitmap.FromFile(FileNames[n].FullName);
aviStream.AddFrame(bitmap);
bitmap.Dispose();
count++;
}
}
aviManager.Close();
}
}
}
在表格1中:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CreateAvi.AviMovie(allfiles);
}
进展:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
已完成:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
这就是我在form1中所做的:
这是 CreateAvi 类中的方法,我对其进行了更改,因此它还将从 form1 中获取 backgroundworker(称为变量 bgw1):
public static void AviMovie(FileInfo[] FileNames,BackgroundWorker bgw1)
{
Bitmap bitmap = (Bitmap)Image.FromFile(FileNames[0].FullName);
AviManager aviManager =
new AviManager(@"c:\temp\new.avi", false);
VideoStream aviStream =
aviManager.AddVideoStream(false, 25, bitmap);
int count = 0;
for (int n = 0; n < FileNames.Length; n++)
{
if (FileNames[n].Length > 0)
{
bitmap =
(Bitmap)Bitmap.FromFile(FileNames[n].FullName);
aviStream.AddFrame(bitmap);
bitmap.Dispose();
count++;
int pctDone = count * 100 / FileNames.Length;
bgw1.ReportProgress(pctDone);
}
}
aviManager.Close();
}
然后在form1中我改变了dowork事件,所以它会得到backgroundworker1:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
CreateAvi.AviMovie(allfiles,backgroundWorker1);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label9.Text = getallfiles[e.ProgressPercentage].FullName;
}
所以progressBar 真正达到100% 到最后。但是,在 label19 中,我只看到文件 000101.jpg,在这个 idrectory 中有 167 个文件,最后一个是 000167.jpg
getallfiles 是 FileInfo[]
在 form1 构造函数中我做了:
var directory = new DirectoryInfo(mainDirectory);
getallfiles = directory.GetFiles("*.jpg");
我看到 getallfiles 包含 167 个文件。如何向标签报告正在处理的文件名?
【问题讨论】:
-
您可以在 form1 上创建一个方法来更新 ProgressBar 的值(可能是自调用)。然后访问它或重构您的 CreateAviClass 以便它接受该方法的委托,您可以从您当时的非静态 AviMovie 方法调用该委托。 编辑: 或者只使用 DGibbs 建议的 Backgroundworker 的 ReportProgress 方法
-
看看我的任务,请用我尝试将文件名报告给实验室的内容更新它
-
在我没有显示我在 createavi 类中更改的内容之前再次编辑了我的问题我更改了方法,因此它将获得 backgroundworker1。
-
更新标签将按照我在第一条评论中的建议进行。直接或通过委托访问的 Form1 上的自调用方法。