Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 9 odgovora
  • 3.560 pregleda

Najnovija ↓

Vrednost varijabli izmedju 2 threada (VB.net) 26.02.2009. u 22:39 · pre 215 meseci #1
Poz svima

Imam u programu 2 thread-a
Prvi radi non stop(petlja) i sluzi za komunikaciju a drugi kontrolise neke procese.
Kada drugi thread zatreba neki info on posalje zahtev i udje u petlju gde ceka vrednost varijable koja mu treba i koja se generise u prvom thread-u.

Varijabla je integer i definisana je kao
Code:
Public Shared Vrednost as Integer

Problem je sto se nova vrednost te varijable (vrednost setuje thread 1) u threadu 2 promeni tek kada dodam
Code:
Application.doevents


Pitanje je kako da se refresuje vrednost varijable bez
Code:
Application.doevents
Potpis
Hear all, trust nothing!
Re: Vrednost varijabli izmedju 2 threada (VB.net) 26.02.2009. u 23:39 · pre 215 meseci #2
U c# za to sluzi volatile keyword.
E sad, mislim da ovo nema u VB.NET ali ovo ti je hint sta da googlas :)

Pozdrav
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
Re: Vrednost varijabli izmedju 2 threada (VB.net) 27.02.2009. u 02:21 · pre 215 meseci #3
Da da to je to i jeste tacno da nema u VB
Hvala puno
Ako nekome treba VB implementacija je:
Code:
Function VolatileRead(Of T)(ByRef Address As T) As T
    VolatileRead = Address
    Threading.Thread.MemoryBarrier()
End Function

Sub VolatileWrite(Of T)(ByRef Address As T, ByVal Value As T)
    Threading.Thread.MemoryBarrier()
    Address = Value
End Sub
Potpis
Hear all, trust nothing!
Re: Vrednost varijabli izmedju 2 threada (VB.net) 27.02.2009. u 15:21 · pre 215 meseci #4
Kakve veze ima volatile sa application.doevents? ovo ce pre biti neki drugi problem. Na koji nacin thread1 setuje vrednost?
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: Vrednost varijabli izmedju 2 threada (VB.net) 27.02.2009. u 22:20 · pre 215 meseci #5
Citat:
mmix: Kakve veze ima volatile sa application.doevents? ovo ce pre biti neki drugi problem. Na koji nacin thread1 setuje vrednost?


Ima direktne veze.

Edit: Sa DoEvents nema, ali sa izmenom vrednosti iz drugog thread-a ima direktne veze.

Pozdrav
Potpis
Sad mu nije nista, ubio si ga k'o zeca...
Re: Vrednost varijabli izmedju 2 threada (VB.net) 27.02.2009. u 22:23 · pre 215 meseci #6
Pa application.doevents valjda tera aplikaciju da zavrsi sve poslove koje bi noramalno uradila tek kad dodje u idle stanje, tj kad ne radi nista. Pretpostavljam da je jedan od tih poslova i da prebaci tu varijablu iz nekog privremenog registra (ili gde se vec nalazi) na njeno pravo mesto.

U normalnim uslovima varijabla promenjena u nezavisnom threadu se setuje trenutno ali ne i ako je glavni thread zauzet, tj ako se nalazi u nekoj petlji koja duze traje.

A vrednost varijable sam do sada setovao normalno, npr vrednost = 2, a sada ide preko ovog VolatileWrite a citanje preko VolatileRead i to sada radi kako treba bez application.doevents.
Potpis
Hear all, trust nothing!
Re: Vrednost varijabli izmedju 2 threada (VB.net) 27.02.2009. u 23:46 · pre 215 meseci #7
Mislim da niste bas 100% skopcali sta je volatile field a isto se moze lako videti iz vb.net implementacije, volatile znaci samo da je SVE sto je sekvencijalno upisano u memoriju pre volatile polja sigurno i uslo u memoriju PRE volatile polja, sto ima smisla ako i samo ako koristis volatile polje za sinhronizaciju threadova (sto bobby radi) pa hoces da se osiguras da je sve ono sto je uradjeno PRE signalovanja "Vrednost" polja vec u memoriji da drugi thread moze da ga procita.


Dakle, volatile nije bio problem ovde jer je polje vrednost sasvim sigurno bilo promenjeno (i nikakav doevents mehanizam nije ukljucen u tu pricu, doevent zoves u glavnom threadu da ti aplikacija ne bi postala unresponsive). ja bih ti inace toplo preporucio da ne radih sinhronizaciju threadova kroz volatiole polja, cak i u najgrdjoj varijanti sa signalizacijom flegovima bolje koristi lock() tj critical sections. To sto volatile int kod tebe radi kao efektivna interlocked operacija ne znaci da ce isto raditi na svim platformama (npr 16bit). Bila je poprilicna tema oko ovoga na AoP.
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: Vrednost varijabli izmedju 2 threada (VB.net) 01.03.2009. u 21:35 · pre 215 meseci #8
probaj da koristis referencijalni tip.
integer koji ti imas je value type, i ide na stek (a svaki tred ima svoj stek).
ref tipovi idu na heap koji je zajednicki za sve tredove...
Re: Vrednost varijabli izmedju 2 threada (VB.net) 01.03.2009. u 22:33 · pre 215 meseci #9
Jok,
to je shared polje, ne ide na stack
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: Vrednost varijabli izmedju 2 threada (VB.net) 05.03.2009. u 13:31 · pre 215 meseci #10
Radi i:
Code:
Synclock (Me)
Vrednost=2
End Synclock

Mada, iskreno, ne razumem mehanizam, tj ne razumem sta se ovde desava.

Koja je razlika izmedju Volatile i Synclock u ovom slucaju?
Sta je bolje (sigurnije)?
Potpis
Hear all, trust nothing!
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme