Programowanie asynchroniczne - Windows Form


(Przemek89k) #1

Cześć,

 

mama Dll'ke w takiej postaci:

 

    public void Oblicz() {
            for(int i = 0; i < iteracje; i++)
                for (int z = 0; z < iteracje; z++) {
                    wynik += i;
                }
        }

        public int ZwrocWynik() {
            return wynik;
        }

Nie musicie się zagłębiać w kod - chodzi o to, że jest tam pętla, która robi proste obliczenia a jak chce wyciągnąć wynik to korzystam z metody ZwrocWynik();

 

No i teraz tworze sobie WinForma - nowy projekt i dodaję referencje w postaci powyższego pliku DLL i mam taki kod:

 

   Liczenie obliczaj = new Liczenie();
          obliczaj.Oblicz();
          int wynik = obliczaj.ZwrocWynik();
          label1.Text = wynik.toString();

Chodzi mi teraz o to, że wynik w labelu1 jest wpisywany dopiero gdy zakończy się metoda Oblicz(), a ja chciałbym żeby była tam aktualna wartość tzn. żeby w trakcie trwania metody Oblicz() wynik się pokazywał.

 

Jak mam poprawić ten kod, aby na bieżąco odczytywać wartość zmiennej "wynik" z Dll'ki.


(Spam) #2

http://www.dotnetperls.com/backgroundworker


(Przemek89k) #3

Czytałem o tym już wcześniej, ale mógłbyś napisać jak to zrobić dla przykładu powyżej.


(kostek135) #4

W twoim przypadku pomóc się nie da, bo nie wiadomo czego oczekujesz. To znaczy mamy metodę, która coś liczy oraz nie zdefiniowałeś czego oczekujesz podczas liczenia (bo przecież chyba nie wyniku - przypominam liczenie trwa w oddzielnym wątku, ale to nie znaczy, że magicznie przewidujemy jego wynik, tylko po procesie przetwarzania zostanie wywołany callback, który uaktualni UI). Tak czy inaczej wątpię, że zrobi to ktoś za ciebie. W TYM linku masz trochę lepiej to podzielone. Zwróć uwagę na metodę ReportProgress, która musisz oprogramować, jakimś napisem "oczekiwanie ..." albo coś podobnego (najlepiej użyć progressbar).


(Przemek89k) #5

Nie wiem co jest tutaj nie jasnego - po prostu oczekuję tego, aby w trakcie liczenia wynik był wyświetlany na bieżąco - czyli jak mam pętle for, w której leci dodawanie to chcę, żeby w Labelu pokazywało:

 

1

2

3

.....

55

 

i tak dalej - czyli aktualną wartość danej zmiennej, a nie dopiero po skończonych obliczeniach.


(kostek135) #6

W takim razie przejrzyj link + oprogramują tę metodę, którą wymieniłem w moim pierwszym poście (w niej masz podać, która kontrolka, ma się zmienić i w jaki sposób)


(pebal) #7

Możesz to zrealizowć np. tak:

Thread thread;
private void button1_Click(object sender, EventArgs e)
{
  if (thread != null) return;

  System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();     
  timer.Interval = 10;
  timer.Tick += delegate(object s, EventArgs ea) 
  { 
    label1.Text = ZwrocWynik().ToString(); 
  };
  timer.Start();

  thread = new Thread(delegate()
  {
    Oblicz();
    BeginInvoke((MethodInvoker)delegate 
    {
      timer.Dispose();
      label1.Text = ZwrocWynik().ToString(); 
      thread = null;
    });
  });

  thread.IsBackground = true;
  thread.Start();
}