Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vrednost varijabli izmedju 2 threada (VB.net)

[es] :: .NET :: Vrednost varijabli izmedju 2 threada (VB.net)

[ Pregleda: 2478 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Vrednost varijabli izmedju 2 threada (VB.net)26.02.2009. u 21:39 - pre 184 meseci
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

Hear all, trust nothing!
 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
*.dynamic.sbb.rs.



+6 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)26.02.2009. u 22:39 - pre 184 meseci
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
Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)27.02.2009. u 01:21 - pre 184 meseci
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

Hear all, trust nothing!
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)27.02.2009. u 14:21 - pre 184 meseci
Kakve veze ima volatile sa application.doevents? ovo ce pre biti neki drugi problem. Na koji nacin thread1 setuje vrednost?

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ć
 
Odgovor na temu

Toxter
NS

Član broj: 39393
Poruke: 317
*.dynamic.sbb.rs.



+6 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)27.02.2009. u 21:20 - pre 184 meseci
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
Sad mu nije nista, ubio si ga k'o zeca...
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)27.02.2009. u 21:23 - pre 184 meseci
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.
Hear all, trust nothing!
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)27.02.2009. u 22:46 - pre 184 meseci
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.
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ć
 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.85.*

ICQ: 20785904


+4 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)01.03.2009. u 20:35 - pre 184 meseci
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...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)01.03.2009. u 21:33 - pre 184 meseci
Jok,
to je shared polje, ne ide na stack
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ć
 
Odgovor na temu

bobby63
Nis

Član broj: 11398
Poruke: 180
*.dynamic.sbb.rs.



Profil

icon Re: Vrednost varijabli izmedju 2 threada (VB.net)05.03.2009. u 12:31 - pre 184 meseci
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)?
Hear all, trust nothing!
 
Odgovor na temu

[es] :: .NET :: Vrednost varijabli izmedju 2 threada (VB.net)

[ Pregleda: 2478 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.