Oprettet søn. d. 29. august 2010 kl. 23:11:36

mjall0w
mjall0w (16.030 point. Point ude: 440)

Kalde background thread og lave cross-threading

Hej.
Kalder diverse funktioner i en background-thread, og får en fejl om "Fejl på tvær af tråde".
Jeg har prøvet at en cross-thread præcis som de gør, men giver mig stadig fejl om "Handling på tværs af tråde......".

I mange af de funktioner jeg kalder benytter jeg rigtig mange tekstbokse og labels der konstant skal ændres værdi af.

Hvordan kan jeg løse mit problem?

Håber der er hjælp at finde derude.

PS. føler ikke der er så meget grund til at paste min code, da det er en helt almindelig background worker der kalder en funktion, hvori der ændres en textbox's indhold.

Skrevet søn. d. 29. august 2010 kl. 23:22:59| #1

buzzzz
buzzzz (46.576 point)
ifyoudo.net
"Jeg har prøvet at en cross-thread præcis som de gør, men giver mig stadig fejl om "Handling på tværs af tråde......"."

Say what har du prøvet ?

Skrevet søn. d. 29. august 2010 kl. 23:24:50| #2

buzzzz
buzzzz (46.576 point)
ifyoudo.net
Kig her:
http://www.eksperten.dk/ (...)

Det burde give en ide om hvordan det skal løses.

mvh

Skrevet man. d. 30. august 2010 kl. 00:56:26| #3

lasserasch
lasserasch (9.742 point)
www.r-coding.dk
Eller du kan kigge på det her eksempel. En anden vej at gå...

http://www.r-coding.dk/ (...)

mvh.
Lasse

Skrevet man. d. 30. august 2010 kl. 08:55:38| #4

mjall0w
mjall0w (16.030 point)
Hov, var lidt for hurtigt der.
Når fejlen opstår i MS VS, kommer de med link til nogle eksempler hvor de gør det, og hvis jeg gør det præcis som de gør det der, får jeg stadig fejl,
http://msdn.microsoft.com/ (...)(VS.90).aspx

Men der findes simpelthen ingen anden måde end at tjekke om det skal Invokes hver gang jeg skal ændre et objekt? Det drejer sig nemlig og rigtig MANGE objekter jeg løbende skal ændre.

Det backgroundworker eksempel virker desværre heller ikke, da det er en masse funktioner jeg kalder så snart jeg aktiverer min background.

Skrevet man. d. 30. august 2010 kl. 09:38:24| #5

buzzzz
buzzzz (46.576 point)
ifyoudo.net
WPF har vist noget der er bedre ... men siden du bruger WinForms, bliver du nok nødt til at tage den her vej, jeg har endnu ikke set andre måder det kan løses på.

Men det kan helt sikkert laves meget generisk, så der ikke er så meget kode der skal laves alligevel.

Skrevet man. d. 30. august 2010 kl. 10:28:53| #6

mjall0w
mjall0w (16.030 point)
Ja, det er sku noget værre pis det her ;)
Well, fandt frem til jeg vil benytte det her,

                    this.login.Invoke((ThreadStart)delegate()
                    {
                        login.Enabled = true;
                    });

og det virker helt efter planen.
Så for at gøre det nemmere må jeg jo skrive en funktion der tillægger sig de Form objekter jeg vil redigere, så jeg er fri for at skrive den kode hver gang jeg skal ændre noget i min form, men bare kan kalde funktionen hvori jeg angiver hvilket objekt jeg vil ændre ved.

Tak for hjælpen.

Smider du et svar buzzzzzz?

Skrevet man. d. 30. august 2010 kl. 10:51:17| #7

buzzzz
buzzzz (46.576 point)
ifyoudo.net
Ja, men i sidste ende er det for din egen skyld det blev lavet sådan her i .NET 2 og frem ...

Nogen gange ville det være nemmere at man kunne, det vil jeg give dig ret i, det burde være en setting.

svar.

Skrevet man. d. 30. august 2010 kl. 12:23:51| #8

lasserasch
lasserasch (9.742 point)
www.r-coding.dk
Men hvorfor bruger du så ikke en background worker. Det er jo lige netop det som den kan. Altså opdatere din form fra en anden tråd.

Umiddelbart virker det da lidt skørt at skrive sin egen funktion til det, når den findes i forvejen???

Mvh.
Lasse

Skrevet tir. d. 31. august 2010 kl. 21:26:32| #9

mjall0w
mjall0w (16.030 point)
lasserasch, det er fordi jeg har skrevet et forholdsvis stort program nu, og det er delt op i funktioner. Programmet kører sig selv hele tiden i løkker og foretager det ene på det andet gang på gang. Og når jeg starter "startfunktionen()" fra backgroundworker, får jeg disse fejl med at jeg har kaldt dem fra en anden tråd.
Det er derfor jeg gør det, ellers kan jeg kun give dig helt ret.

Skrevet ons. d. 01. september 2010 kl. 14:02:34| #10

aaberg_cc
aaberg_cc (38.768 point)
Hvis du ikke gider lave invokes for samtlige operationer, så kan du altid sætte følgende property:
Form.CheckForIllegalCrossThreadCalls = false;

Så vil dine cross-thread operationer virke helt fint.

Bare husk på at der er en grund til at cross-thread operationer som default ikke er lovlige. Hvis du ikke holder tungen lige i munden, risikere du deadlocks i dit program. Men hvis du føler dig rimelig sikker på at det er OK det du laver, så skal der ikke være noget i vejen for at sætte CheckForIllegalCrossThreadCalls propertien til false.

Skrevet ons. d. 01. september 2010 kl. 18:02:14| #11

lasserasch
lasserasch (9.742 point)
www.r-coding.dk
Om du opretter en tråd eller bruger en background worker er jo det samme. Men hvis du bruger en background worker har du jo en masse events du kan hooke dig op på = De funktioner du nu vil skrive selv.

Jeg kan ikke rigtig se idéen med ikke at gøre det.

Og om du skal oprette en ny tråd eller en ny background worker er jo lige nemt.

Men ja, du kan ikke kalde en anden funktion som skal opdatere UI direkte fra en backgroundworkers arbejdstråd, men dertil har man jo "ReportProgress" metoden. Og evented som bliver fyret af når den metode kaldes kører i samme tråd som UI og kan dermed opdatere UI.

Mvh.
Lasse

/Out

Skrevet ons. d. 01. september 2010 kl. 20:06:09| #12

mjall0w
mjall0w (16.030 point)
Tak aaberg, selvom det kom lidt for sent :/ Meget praktisk ihvertfald.
Selvom jeg har brugt adskille timer på at omskrive hele koden.

Kører det også i en backgroundthread, men selve problemet i spørgsmålet her var netop at jeg ikke kunne opdatere UI fra en anden tråd en backgroundworkeren.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Koordinater for nyt vindue efter scroll, csharp.

Oprettet den 11. februar 2012 kl. 01.54
bjarnefilm giver 30 point for svar | Giv et svar »

Treeview hovedmenu á lá Dynamics C5

Oprettet den 10. februar 2012 kl. 08.12
olehaahr giver 30 point for svar | Giv et svar »

Deployment på Windows Mobile 6.5

Oprettet den 9. februar 2012 kl. 13.59
schristensen giver 200 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger