Avatar billede pfp Nybegynder
17. april 2005 - 12:24 Der er 9 kommentarer og
2 løsninger

Hvordan anvendes ProgressBar i praksis?

Hej,

Nogen der kan forklare lidt om hvordan ProgressBar controllen anvendes i praksis. Jeg har læst om den på MSDN, og kan også godt sætte min, max og value...men hvordan dælen knytter man dens "fremskridt" til en given funktion.

Jeg kunne godt tænke mig at anvende den i forbindelse med et lille tool jeg brygger på, hvor n antal billeder resizes og gemmes.

Det ville være smart om jeg så snart gennemløbet af billedsamlingen starter åbner en lille dialogbox med en progressbar, i modsætning til nu, hvor computeren mere eller mindre fryser indtil den har arbejdet færdig.

Nogen gode råd eller idéer?

/pfp
Avatar billede driis Nybegynder
17. april 2005 - 12:30 #1
Du skal sætte ProgressBar.Value property'en.
Avatar billede burningice Nybegynder
17. april 2005 - 12:33 #2
1) koden der reziser dine billeder skal køre i en ny tråd
2) Min value sætter du til 0, og MaxValue sætter du til antal billeder der skal resizes
3) Hver gang du har resizet et billede skal du lade din kode tælle Value på ProgressBar'en en op. Husk at brug Invoke, da din resize-kode kører i en anden tråd en ProgrssBar'en
Avatar billede burningice Nybegynder
17. april 2005 - 12:33 #3
du kan evt. kalde Increment(1) istedet for at sætte value, men det er bare en smagssag
Avatar billede driis Nybegynder
17. april 2005 - 12:34 #4
I dit givne problem ville jeg nok lave en arbejdstråd som går arbejdet, så undgår du også at din GUI er låst mens arbejdet udføres. Fra denne arbejdstråd kan du aktivere en event, som i GUI'et er kædet sammen med en metode, der tæller ProgressBar.Value en frem.

På den måde har du adskilt GUI og logik, men har en fin måde at få opdateret din ProgressBar.
Avatar billede burningice Nybegynder
17. april 2005 - 12:40 #5
det aller pæneste vil være at lave en delegate som indeholder den funktion der tæller en op på progressbaren. Denne delegate bruger du så som argument til din Resize-funktion som du så kalder. På den måde har du en meget løs kobling mellem Resize-funktionen og selve dit GUI.
Avatar billede pfp Nybegynder
17. april 2005 - 12:43 #6
Tak for jeres indlæg.

Jeg har endnu hverken arbejdet med threads eller delegates i C#, så det er da en glimrende ting at komme i gang med så :)

Jeg vender tilbage, når jeg har leget lidt med det.
Avatar billede burningice Nybegynder
17. april 2005 - 12:49 #7
eks.

public delegate void NotifyPictureRezisedDelegate(int numberOfPictureResized);

public void UpdateProgressBar(int val) {
  this.ProcessBar.Value = val;
}

public void btn_Click(object sender, EventArgs e){

  NotifyPictureRezisedDelegate del = new NotifyPictureRezisedDelegate(this.UpdateProgressBar);

  ThreadPool.QueueUserWorkItem(new WaitCallback(this.ResizePictures), del)
}

public void ResizePictures(object o) {

  NotifyPictureRezisedDelegate del = (NotifyPictureRezisedDelegate)o;

  int pictureResized = 0;

  foreach (Bitmap bmp in PicturesToBeResized) {
      [...] // Resize picture
      pictureResized++;
      del(pictureResized);
  }
}
Avatar billede burningice Nybegynder
17. april 2005 - 12:51 #8
du kan også kapse hele din billed-logic ind i sin egen klasse og lave nogle events der melder tilbage om at nu er der et billed der er resized.
Avatar billede burningice Nybegynder
17. april 2005 - 13:03 #9
eks. på det ville være

public class ImageResizer() {

  public delegate void ImageResizedEventHandler(object sender, EventArgs e);

  private Bitmap[] imagesToBeResized;

  private ArrayList imagesResized;
  public Bitmap[] ImagesResized {
      get { return (Bitmap[])imagesResized.ToArray(typeof(Bitmap));
  }

  public ImageResizer(Bitmap[] imagesToBeResized) {
      this.imagesToBeResized = imagesToBeResized;
  }

  public void Start() {
      imagesResized = new ArrayList();

      foreach (Bitmap bmp in PicturesToBeResized) {
        [...] // Resize picture
        imagesResized.Add(bmp);
        OnImageResized(EventArgs.Empty);
      }
  }

  public event ImageResizedEventHandler ImageResized;
  protected virtual void OnImageResized(EventArgs e) {
      if (this.ImageResized != null) ImageResized(this, e);
  }
}

på din form:

public void resizer_ImageResized(object sender, EventArgs e) {
  progressBar.Increment(1);
}

public void btn_Click(object sender, EventArgs e){

  ImageResizer resizer = new ImageResizer(dineBilleder);
  resizer.ImageResized += new ImageResizer.ImageResizedEventHandler(this.resizer_ImageResized);
 
  Thread t = new Thread(new ThreadStart(resizer.Start()));
  t.Run();
}
Avatar billede pfp Nybegynder
26. april 2005 - 15:20 #10
cf, smider du lige et svar?

Endelig virker det :)
Avatar billede burningice Nybegynder
26. april 2005 - 15:52 #11
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester