[ Aleksandrov @ 12.12.2010. 17:23 ] @
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
[ Dusan Kondic @ 13.12.2010. 06:45 ] @
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.
[ mmix @ 13.12.2010. 07:40 ] @
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.
[ Dusan Kondic @ 13.12.2010. 08:58 ] @
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.
[ Boris B. @ 14.12.2010. 18:43 ] @
"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.