• 4 odgovora
  • 3.577 pregleda
C# tredovi i konzolna aplikacija 12.12.2010. u 17:23 · pre 193 meseci #1
Pozdrav,

Napravio sam program u kojem imam nekoliko tredova.

U jednom tredu imam
Code:
 
...
               Console.SetCursorPosition(0, 7);
                Console.Write("Uspostavljena je konekcija sa: " + IPADDR);
...


u drugom tredu imam
Code:

...
                Console.SetCursorPosition(3, 12);
                Console.Write("Uspesno ocitavanje preko wirelessa");
...


u trecem tredu imam
Code:

...
                Console.SetCursorPosition(0, 11);
                Console.Write("Trenutno vreme je: " + DateTime.Now.ToString());
...


Desava se da se u toku izvrsavanja programa javi greska da se na mestu predvidjenom za ispis jednog stringa ispise drugi string. NPR. da se na Poziciji konzole (3,12) ispise trenutno vreme.
Pitanje je:
kako da podesavanje pozicije na konzoli povezem sa ispisom na konzoli tj. da se nakon postvaljanja kursora na odredjenu poziciju obavezno izvrsi ispis namenjen toj poziciji.

Hvala
Potpis
---------------------
****
< 9 9 > My name
..( o ).. is
. . -- . .MX86251 ?
Re: C# tredovi i konzolna aplikacija 13.12.2010. u 06:45 · pre 193 meseci #2
Verovatno ti se thread-ovi preklapaju. Prvo ti se izvrši prva komanda prvog thread-a,
zatim prva komanda drugog threada, druga komanda prvog thread-a ...
Upotrebi callback ili postavi flag-ove tako da naredni thread mora da sačeka završetak
izvršavanja prethodnog.
Re: C# tredovi i konzolna aplikacija 13.12.2010. u 07:40 · pre 193 meseci #3
flagovi?

Nista nece spreciti threead overrun ako ne koristis sistemske synch objekte (zbog sistemskog spinlocka). dakle lock(zajednickainstanca) u svim blokovima koji rade sa konzolom.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: C# tredovi i konzolna aplikacija 13.12.2010. u 08:58 · pre 193 meseci #4
Ja lično koristim callback-ove radi pravilne sinhronizacije, ali zar ne mogu
flagovi da se iskoriste na sledeći način?
Code:

                    for (int i = 0; i < 1000; i++)
                    {
                        if (FlgUTokuMojThread1 == false && FlgUTokuMojThread2 == false)
                        {
                            StartovanMojThread3 = true;
                            MojThread3.Start();
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(20);
                        }
                    }
                    if (StartovanMojThread3 == false)
                    {
                        MessageBox.Show("Došlo je do greške prilikom izvršavanja posla MojThread3.");
                    }

Molio bih za objašnjenje mmix jer dosta koristim thread-ove kada komuniciram sa uređajima pa me sve zanima.
Hvala.
Re: C# tredovi i konzolna aplikacija 14.12.2010. u 18:43 · pre 193 meseci #5
"Goli" flegovi se ne koriste (bar ne u tom tvom obliku) zato što ti niko ne garantuje da se neće desiti thread-switch između pisanja/čitanja flega i sledeće linije koda. Na primer:
Code (csharp):

if (FlgUTokuMojThread1 == false && FlgUTokuMojThread2 == false)
{
  //ovde moze biti FlgUTokuMojThread1 ili 2 == true, ako Thread1 ili 2 nisu "fire-once" !
  StartovanMojThread3 = true;
  MojThread3.Start();
}
 


Cak stavise, JIT kompajler moze da optimizuje takve petlje (ako se fleg ne menja u threadu tokom izvršavanja petlje), tako da nikada ni ne proverava fleg, što se delimično otklanja keywordom volatile, mada i dalje ostaje problem sledeće linije koda.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme