我在form1中有一個progressBar1和BackgroundWorker,當我點擊按鈕來創建avi文件時,我希望它根據avi文件的創建進度來報告progressBar。如何在使用BackgroundWorker時向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();
}
}
}
在Form1:
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上創建一個Method,更新ProgressBar的值(可能是自我激勵)。然後eigther訪問它或重構CreateAviClass,以便它接受該方法的委託,您可以從您的非靜態AviMovie方法調用該方法。 *編輯:*或者只是使用DGobbs建議的Backgroundworker的ReportProgress方法 – MrPaulch
看看我的questin,請更新它與我試圖報告文件名稱到一個labe – user3756594
編輯我的問題之前,我沒有顯示我改變了什麼createavi類我改變了方法,所以它會得到backgroundworker1。 – user3756594