DO petllja i Text kontrola

G

Gavras

Gost
Imam 14 DO petlji koje vrse obradu nekih podataka u Visual C#. Zelim da u Text kontroli se upise rezultat obrade nakon svake iteracije.Ovo u Visual C# ne radi jer ispis podatka u Text kontroli ima nizi prioritet od DO petlje(pretpostavljam)!? Reazultat je da se podatak pojavio u Text kontroli kada je program zavrsio svih 14 petlji. kako da resim ovaj problem?
 
Gavras:
Imam 14 DO petlji koje vrse obradu nekih podataka u Visual C#. Zelim da u Text kontroli se upise rezultat obrade nakon svake iteracije.Ovo u Visual C# ne radi jer ispis podatka u Text kontroli ima nizi prioritet od DO petlje(pretpostavljam)!? Reazultat je da se podatak pojavio u Text kontroli kada je program zavrsio svih 14 petlji. kako da resim ovaj problem?

:idea: Ovo nema veze sa prioritetom!

Za početak bi mogao da navedeš svoj kod. Jel to u pitanju 14 umetnutih (ugnežđenih) petlji? Naredni primer je u C++ with Managed Extensions za .NET, ali ćeš razumeti o čemu se radi. Kako bi bio kraći, stavio sam samo dve petlje:

Kod:
[color=darkblue]int n1 = 5000;
int n2 = 2000;
for (int i = 0; i < n1; i++)
{
    for (int j = 0; j < n2; j++)
    {
        textBox->Text = String::Format(S"i={0}, j={1}", __box(i), __box(j));
    }
}[/color]


Verovatno bi u C# postavljanje teksta izgledalo poput (ali nisam 100% siguran):

Kod:
[color=darkblue]    textBox.Text = String.Format("i={0}, j={1}", i, j);[/color]

:idea: Pošalji svoj kod i malo više detalja...
 
Da, u pitanju su 14 ugnjezdenih petlji koje vrse neki proracun. Nije bitno koji proracun se obavlja. Zelim da nakon svakog prolaska kroz sve petlje program rezultat uputi ka tekst kontroli, jer zelim da pratim rad u DO petljama. Ovo ne uspeva. Rezultat se pojavi u tekst kontroli, ali nakon kompletnog obracuna, posle nekoliko minuta. Kako da resim ovaj problem?
 
Gavras:
Da, u pitanju su 14 ugnjezdenih petlji koje vrse neki proracun. Nije bitno koji proracun se obavlja.

Pazi, ovde vrlo verovatno nikoga i ne zanima tvoj proračun! :idea: Ako hoćeš da ti neko pomogne, pošalji svoj kod :!: Izbaci taj toliko važan proračun, pojednostavi kod, ali navedi svoje petlje zajedno sa kodom kojim postavljaš sadržaj text box-a. JEDINO TAKO možeš da očekiješ pomoć!

Gavras:
Zelim da nakon svakog prolaska kroz sve petlje program rezultat uputi ka tekst kontroli, jer zelim da pratim rad u DO petljama. Ovo ne uspeva.

Može li malo preciznije šta podrazumevaš pod prolaskom kroz sve petlje?

Misliš li na to da u svakoj iteraciji poslednje unutrašnje petlje želiš pregled stanja?

Gavras:
Rezultat se pojavi u tekst kontroli, ali nakon kompletnog obracuna, posle nekoliko minuta. Kako da resim ovaj problem?

Kako znaš da je proračun gotov nekoliko minuta pre prikaza teksta u text box-u? Kako si merio ovo vreme? Kako si odredio trenutak kada je proračun završen, tj. kada je počela ta pauza od nekoliko minuta posle proračuna?

Ako si uradio sledeće:
Kod:
    for (i1 ...)
    {
      for (i2 ...)
      {
        for (i3 ...)
        {
          // ... ostale petlje ...

          for (i14 ...)
          {
              // proračun
          }
        }
      }
    }
    textBox.Text = ...;
onda ceo tvoj proračun traje nekoliko minuta i na kraju celog proračuna dobijaš rezultat koji si tražio.

Probaj sledeće:
Kod:
    for (i1 ...)
    {
      for (i2 ...)
      {
        for (i3 ...)
        {
          // ... ostale petlje ...

          for (i14 ...)
          {
              // proračun


              // neposredno pre kraja petlje postavi
              // tekst u tekst box-u.
              textBox.Text = ...;
          }
        }
      }
    }
trebalo bi da dobiješ ono što tražiš!

NAVEDI SVOJ KOD!
 
Hvala, MM sto ima vremena za moj problem. Drugi primer sa 14 DO petlji je tacno prikazan. Jedini problem je sto u C# to ne radi?! Promena vrednosti u tekst kontroli ima manji prioritet od rada u petljama? Rezultat je isti kao da sam kreirao 14 DO petlji u prvom Vasem primeru.Kod ima sledeci izgled:

int intbroj=0;
for(int i1=0;i1<3;i1++)
{
for(int i2=0;i2<3i2++)
{
..
for(int i14=0;i14<3;i14++)
{
obrada();
intbroj++;
textBox1.Text=intbroj.ToString();
}}}}..
Hvala unapred!
 
Gavras:
Drugi primer sa 14 DO petlji je tacno prikazan. Jedini problem je sto u C# to ne radi?! Promena vrednosti u tekst kontroli ima manji prioritet od rada u petljama? Rezultat je isti kao da sam kreirao 14 DO petlji u prvom Vasem primeru.

Ostaje još pitanje gde si smestio ovaj kod, tj. u koju metodu! Verovatno je tvoja greška što si proračun stavio u neki EVENT HANDLER! Nije u pitanju prioritet već način na koji se Event Handlers pozivaju... Da ne objašnjavam sad kako Event-Driven sistem funkcioniše i kako radi Message Loop, evo ukratko: kada postaviš tekst sa textBox1.Text = ..., ti si zapravo postavio sadržaj promenljive unutar textBox1 i poslao poruku da se textBox1 ponovo iscrta. Međutim, poruke se obrađuju jedna po jedna, a tvoj Event Handler trenutno obrađuje neku od njih - npr. pritisak dugmeta. Tek kada izađeš iz Event Handler-a, biće obrađene ostale poruke, a time i iscrtavanje novog sadržaja textBox-a. RAZLOG ZA TO JE ŠTO JE U PITANJU JEDAN ISTI THREAD IZVRŠAVANJA!!!

:idea: Koristi zaseban thread za obradu!

1. u svoju klasu dodaj:
Kod:
    using System.Threading;


    // atributi tvoje klase (form-a).
    Thread thread;
    TextBox textBox1;

    // pomocni metod koji obavlja proracun,
    // bice pokrenut u zasebnom thread-u.
    // !!! prototip mora biti:    Void naziv(Void);
    Void obradaThreadProc()
    {
        int intbroj = 0;
        for (int i1 = 0; i1 < 3; i1++)
        {
            for (int i2 = 0; i2 < 3; i2++)
            {
                // ...
                for (int i14 = 0; i14 < 3; i14++)
                {
                    obrada();
                    intbroj++;
                    textBox1.Text = intbroj.ToString();
                }
            }
        }
    }


kada treba da pokreneš proračun (OnButtonClick() i sl.), izvrši sledeći kod:

Kod:
    thread = new Thread(new ThreadStart(  obradaThreadProc  ));
    if (!thread)
    {
        throw new Exception("Failed to create a thread!");
    }
    thread.IsBackground = true;
    thread.Start();

NAPOMENA: Ja sam C++ programer, tako da treba da proveriš sintaksu... Takođe, proveri parametre konstruktora ThreadStart(), u C++ je ovo malo drugačije! Pogledaj u MSDN više o thread-ovima. Možeš po potrebi i da napraviš zasebnu klasu koja će da nasledi Thread... a kojoj ćeš kroz konstruktor da proslediš referencu na TextBox u kog treba smestiti status...
 

Back
Top