Forum » Programiranje » [c#] Vprasanje glede BackGroundWorker classa in spreminanja gui elementa
[c#] Vprasanje glede BackGroundWorker classa in spreminanja gui elementa
KernelPanic ::
Spostovani!
Imam aplikacijo, ki preko BackgroundWorker objekta bere status naprave. To je vse ok, vendar moram sedaj glede na stanje nekega bita sprementi besedilo objekta Label v GUI. Ko probam nastaviti tekst, mi javi sledece (ko program deluje), mi javi sledece:
Imam aplikacijo, ki preko BackgroundWorker objekta bere status naprave. To je vse ok, vendar moram sedaj glede na stanje nekega bita sprementi besedilo objekta Label v GUI. Ko probam nastaviti tekst, mi javi sledece (ko program deluje), mi javi sledece:
System.InvalidOperationException was unhandled by user codeKako iz BackgroundWork objekta spremenis gui element v klicajocem GUI glavnem threadu?
Message=Cross-thread operation not valid: Control 'm_tbLastTransaction' accessed from a thread other than the thread it was created on.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.set_WindowText(String value)
at System.Windows.Forms.TextBoxBase.set_WindowText(String value)
at System.Windows.Forms.Control.set_Text(String value)
at System.Windows.Forms.TextBoxBase.set_Text(String value)
at System.Windows.Forms.TextBox.set_Text(String value)
at AccuLoadIIIMonitor.FormMain.checkTransactionIdetificationNumbers() in D:\Projects\AccuLoadIIISolution\AccuLoadIIIMonitor\FormMain.cs:line 1342
at AccuLoadIIIMonitor.FormMain.m_bwProcessAccuLoadIII_DoWork(Object sender, DoWorkEventArgs e) in D:\Projects\AccuLoadIIISolution\AccuLoadIIIMonitor\FormMain.cs:line 1679
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:
Ericssony ::
Z metodo Invoke na objektu.
Z uporabo "Lambda Expression" narediš to preprosto tako:
ImeObjekta.Invoke((Action)(() => ImeObjekta.Lastnost = novaVrednost));
Drug način pa je z uporabo "delegat-a":
this.Invoke(new MethodInvoker(ImeMetode));
Znotraj ImeMetode pa narediš to kar pač moraš.
Z uporabo "Lambda Expression" narediš to preprosto tako:
ImeObjekta.Invoke((Action)(() => ImeObjekta.Lastnost = novaVrednost));
Drug način pa je z uporabo "delegat-a":
this.Invoke(new MethodInvoker(ImeMetode));
Znotraj ImeMetode pa narediš to kar pač moraš.
urbecar ::
Ali a izsek iz MSDN: To set up for a background operation, add an event handler for the DoWork event. Call your time-consuming operation in this event handler. To start the operation, call RunWorkerAsync. To receive notifications of progress updates, handle the ProgressChanged event. To receive a notification when the operation is completed, handle the RunWorkerCompleted event.
Ericssony ::
Ravno iz DoWork event handlerja ne mores dostopati do glavne niti zato moras uporabiti zgoraj omenjen nacin...
nightrage ::
Zadevo lahko verjetno rešiš na več načinov jaz vem za dva
1. s pomočjo delegatov
2. s pomočjo ProgressChanged metode, ki jo ima background worker za updatati stanja na gui-ju.
1. s pomočjo delegatov
2. s pomočjo ProgressChanged metode, ki jo ima background worker za updatati stanja na gui-ju.
KernelPanic ::
Ok, samo kdaj se ta ProcessChanged event prozi, jaz imam neskoncno zanko v threadu, ker mora iz naprave nonstop brati stanje, da nato v GUI threadu prikazujem stanja (v obliki semaforja - zeleno HIGH, rdece LOW)
Ericssony ::
ProgressChanged event prožiš sam v eventu DoWork z metodo ReportProgress(i). Še prej pa moraš nastaviti lastnost WorkerReportsProgress...
Glede na to, da imaš v eventu DoWork neskoncno zanko ti ne preostane drugo kot Invoke na objektu.
Glede na to, da imaš v eventu DoWork neskoncno zanko ti ne preostane drugo kot Invoke na objektu.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c#] Vprasanje glede eventovOddelek: Programiranje | 1408 (1122) | Looooooka |
» | [c#] Vprašanje glede release verzije aplikacijeOddelek: Programiranje | 1501 (1325) | Ericssony |
» | Tezava pri instanciranju class-aOddelek: Programiranje | 1303 (1174) | KernelPanic |
» | C# BackgroundWorker Class problemOddelek: Programiranje | 1266 (1222) | hendriks |
» | null reference exception na čudnem mestu C#Oddelek: Programiranje | 1312 (1249) | krho |