» »

Vprasanje glede koncepta programa [c#]

Vprasanje glede koncepta programa [c#]

KernelPanic ::

Spostovani!

Imam sledece vprasanje: Narediti moram program, ki na nek interval bere podatke iz baze (3 tabele) in glede na prebrane podatke update-a GUI. To je vse ok, vendar imam sledec probem. Ce v GUI dodam timer in na ta timer obesim celotno branje baze in update GUI elementov v programu, program postane logicno neodziven in to ni ok. Zato sem vse skupaj spravil (timer sem odstranil) na BackgroundWorker sistem in sedaj deluje lepo. Vendar, kako naj kontroliram sedaj interval branja, oz. ali so kaksne pasti, ce bi v backgroundworker thread dodal timer in ga prozil tam?

Najlepsa hvala za odgovore,
M.

Vesoljc ::

če je sinhronizacija poštimana (background worker -> main thread gui), potem timer v svojem threadu ne bi smel bit problem, pa upam da si dal kak sleep/pause v workerja :)
Abnormal behavior of abnormal brain makes me normal...

KernelPanic ::

Ja to rabim zdej sprogramirat, pa se mi "ödvratno" zdi rinit timer v thread, a je mogoce casovno kontrolirati direktno workerja?

Vesoljc ::

jah, naredi workerja brez loopa, pa ga zalaufi takrat ko hočeš... sam to se pa meni zdi odvratno :)
Abnormal behavior of abnormal brain makes me normal...

misek ::

Uporabi sinhronizacijo med thread-i. Štartaj worker thread, ki čaka na neki pogoj. Ta pogoj pa nastaviš po izteku timerja v GUI-ju. Malce si preberi o "thread synchronization".

Spura ::

Cakaj zakaj preprosto v BackgroundWorker threadu ne naredis loop s preprostim izhodnim pogojem (naprimer boolean konec) in sleepas nek interval na zacetku vsakega loopa?

_Dormage_ ::

BackgroundWorker in GUI imata skupno spremenljivko
int interval;

Ni potrebno handlat to kot kritično območje in sinhronizirat, če ni zadaj "rocket science".
BackgroundWorker:
while(true){
sleep(GUI.interval);
getData();
}

Z GUI-jem pa nastavljas vrednost spremenljivke interval.
Ko GUI spremeni interval se bo ob prvem zagonu po prejšnjem intervalu vzela nova vrednost.
While loop, ki neprestano čekira neko spremenljivko je CPU eater.

Najlažje je štartat thread, da to dela.

Zgodovina sprememb…

Spura ::

_Dormage_ je izjavil:

Ko GUI spremeni interval se bo ob prvem zagonu po prejšnjem intervalu vzela nova vrednost.
To se zdalec ni nujno.

_Dormage_ ::

Spura je izjavil:

_Dormage_ je izjavil:

Ko GUI spremeni interval se bo ob prvem zagonu po prejšnjem intervalu vzela nova vrednost.
To se zdalec ni nujno.

Ok, majhna verjetnost, ampak naj bo.
Če mora bit zadeva točna pa sinhroniziraj spremenljivko interval.

Spura ::

_Dormage_ je izjavil:

Spura je izjavil:

_Dormage_ je izjavil:

Ko GUI spremeni interval se bo ob prvem zagonu po prejšnjem intervalu vzela nova vrednost.
To se zdalec ni nujno.

Ok, majhna verjetnost, ampak naj bo.
Ti najbrz domnevas da gre za redko ponavljajoc sinhronizacijski problem.
Ni sinhronizacijski problem, ker je zamenjava integer spremenljivke (assignment) atomarna operacija.
Gre za problem z memory modelom v odnosu z vecnitnostjo. Niti imajo lokalno cachirane vrednosti spremenljivk. Ce gui nit spremeni interval lahko traja poljubno dolgo, da bo timer thread videl spremembo. Poleg tega imajo vecprocesorski sistemi lokalne predpomnilnike in morajo izvest posebne sinhronizacijske ukaze.

_Dormage_ je izjavil:


Če mora bit zadeva točna pa sinhroniziraj spremenljivko interval.

Obstaja preprostejsa resitev, ker problem ni v sinhronizaciji. Spremenljivka mora biti deklarirana "volatile" kar forsira, da vse niti ob vsakem dostopu dostopajo do glavne kopije ter hkrati prepoveduje compilerju, da bi spreminjal vrstni red operacij okoli dostopov do te spremenljivke.

Spura ::

Tudi po tem ni zadeva tocna, namrec po izteku intervala danega "sleep" ukazu se ta nit samo premakne iz polja specih niti v polje "runnable" niti, torej niti, katere lahko razvrscevalnik(scheduler) izbere za izvajanje v naslednjem time-sliceu. Kar se zdalec ni gotovo, da bo, sploh ce so pristotne niti z visjo prioriteto (da ne omenjamo ze osnovnega (variablino dolgega) cakanja na konec trenutnega time-slicea). Torej nit se po preteku sleep intervala ne pozene takoj. Za natancen timing je potrebno zraven tudi merit koliko casa je dejansko preteklo. V Javi se ti lahko niti prezgodaj zbudijo iz sleepa iz neznanega razloga, zato je to potrebno tako ali tako pocet, pa treba je lovit ThreadDeath error, da restartas tak background task.

_Dormage_ ::

Glede atmoarnosti, hvala.
ostalo je sama teorija, ki z praktićno rešitvijo nima veze. Stvar dela super tako kot sem opisal.
To, da bi se zaradi odzivnosti GUI-ja obremenjeval z mikrosekundmami razlike, ki jih povzroči razvrščevalnik je absurd!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# osveževanje app

Oddelek: Programiranje
12884 (654) mihies
»

C# threadanje in gui

Oddelek: Programiranje
8696 (587) darkolord
»

[c#] problem pri zapiranju aplikacije

Oddelek: Programiranje
112058 (1696) KernelPanic
»

[c#] Vprasanje glede BackGroundWorker classa in spreminanja gui elementa

Oddelek: Programiranje
6706 (632) Ericssony
»

POMOČ: C# Spremenitev spremenljivke medtem ko teče ukaz while

Oddelek: Programiranje
91570 (1327) Ericssony

Več podobnih tem