Tuesday, 15 May 2012

c# - How do I report to a ProgressBar when working with BackgroundWorker? -



c# - How do I report to a ProgressBar when working with BackgroundWorker? -

i have in form1 progressbar1 , backgroundworker , when clicking button create avi file want study progressbar according avi file creation progress.

this class create avi file:

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; (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(); } } }

in form1:

private void backgroundworker1_dowork(object sender, doworkeventargs e) { createavi.avimovie(allfiles); }

progress:

private void backgroundworker1_progresschanged(object sender, progresschangedeventargs e) { }

completed:

private void backgroundworker1_runworkercompleted(object sender, runworkercompletedeventargs e) { }

this did in form1:

this method in createavi class changed backgroundworker form1 (called variable 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; (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(); }

then in form1 changed in dowork event 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; }

so progressbar 100% end. however, in label19 see until file 000101.jpg , in idrectory there 167 files lastly 1 000167.jpg

getallfiles fileinfo[] , in form1 constructor did:

var directory = new directoryinfo(maindirectory); getallfiles = directory.getfiles("*.jpg");

and see getallfiles contain 167 files. how can study label files names process ?

reportprogress needs called method progress occurring:

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; (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(); }

also, loop needs start @ 0--you skipping first element in filenames.

edit: in background worker's progresschanged event, can't utilize e.progresspercentage array index, have work backward percent index:

private void backgroundworker1_progresschanged(object sender, progresschangedeventargs e) { progressbar1.value = e.progresspercentage; int fileindex = e.progresspercentage * filenames.length/100; label9.text = getallfiles[fileindex].fullname; }

c# .net winforms

No comments:

Post a Comment