Jag har ett problem med trådning som jag inte förstår mig på. Troligtvis är det så att du försöker använda en anslutning du skapat i en annan tråd än ifrån den tråden du skapade den i (blev rörigt) Tack! Nu funkar det bättre! Lite enkelt: ( :-p ) Ännu enklare, Nu har jag lyckats nysta upp trådarna, men något käkar minne vid uppdatering. Verkar inte som det är trådningen. Borde man inte se till att man synkroniserar arbetartråden med GUI-tråden? Fär mig som kommer från C++-världen och slagits med trådade applikationer i MFC så vet man hur fel det kan gå (dock oftast först efter leverans :-) ). Ja du har helt rätt, http://www.cshrp.net/content.aspx?showID=958 Johan,Threading problem
Med jämna mellanrum ska ett DataSet uppdateras från en databas. För att inte applikationen ska störas tänkte jag lägga uppdateringen i en egen tråd.
En timer triggar uppdateringen var 10:e sekund.
Om jag kör funktionen UppdateraTTDB direkt så funkar den klockrent. Men om jag anropar den genom en ny tråd från funktionen UppdateraTT_Thread() får jag felet "Object reference not set to an instace of an object". Felet uppträder på raden med DataAdapter.fill
Någon som vet varför?
Koden ser ut såhär:
Friend Sub UppdateraTT_Thread()
Dim TTtrad As Threading.Thread
TTtrad = New Threading.Thread(AddressOf UppdateraTTDB)
TTtrad.Start()
End Sub
Friend Sub UppdateraTTDB()
Try
Me.DataSetDagNy.Tables("text_tt").Clear()
Me.DataAdapterTT.Fill(Me.DataSetDagNy.Tables("text_tt"))
Catch ex As Exception
MsgBox(ex.Message)
End Try
End SubSv: Threading problem
Dvs.
I din huvudtråd skapar du anslutninge; i din extra-tråd försöker du använda den. Misstänker att det kan ha något med det att göra
En annan variant är att t.ex. DataAdapterTT är nothing. Kolla upp framförallt det där med DataAdapterTT.Sv: Threading problem
Nu skapar jag en ny connection ocg det blir bra!
Hur blir det med tråden jag skapade. Dör den av sig själv när den faller utanför scopet. Dvs när metoden körts klart. Eller måste jag döda den på något sätt?
JSv: Threading problem
En tråd är helt enkelt en funktion som körs i en egen tråd (hm...)
T.ex. har du ju huvudtråden. Om du inte kör något i den, t.ex. en loop (Application.Run() eller form.ShowDialog, den startar också en loop) så tar funktionen slut. Samma sak med tråden; en tråd tar alltid slut när funktionen tar slut.
Men de objekt du skapar i tråden tar inte nödvändigtvis slut ;)Sv: Threading problem
En tråd är en bit av processorns tid som används för att exekvera kod. I .NET startar men en tråds exekvering genom att be den köra koden för en viss funktion. När det inte längre finns någon mer kod att exekvera, dvs när metoden returnerar, så kommer tråden att få en status som "idle". Det innebär att tråden fortfarande lever men den kommer inte att användas av processorn eller operativsystemet förräns den får en ny uppgift och mer kod att exekvera (vilket ändrar dess status från "idle").
I realiteten betyder det at en tråd som inte hanteras efter den avslutat sin exekvering, kommer att fortsätta ta lite resurser. Även om det är väldigt lite resurser i jämförelse med en aktiv tråd.Sv: Threading problem
Visst finns det en funktion som returnerar hur mycket minne applikationen har allokerat? Trodde det fanns i Applicaton eller Environment, men jag hittar inte tillbaka till den.
Nån som vet?Sv: Threading problem
Dvs med ett [Begin/End]Invoke på den kontrollen som skall uppdateras (eller behöver man göra det på formuläret eftersom man går via en DataAdapter (eller kan man göra det på en DataAdapter)?
Jag har fått intrycket att WinForms inte är trådsäkrat automatiskt (det är därför som [Begin/End]Invoke finns).
Kan någon guru upplysa oss?
/AndreasSv: Threading problem
man bör inte, även om det ibland är möjligt, uppdatera GUI ifrån en arbetstråd. Det beror på många faktorer, men kort så är det inte "trådsäkert".
På Control klassen finns Invoke och BeginInvoke för att man skall kunna flytta över exekveringen ifrån arbetstråden till huvudtråden och kunna göra uppdateringar på GUI't.
Jag har skrivit en artikel om just det här, den kommer. Men så länge finns kodexemplet här: Programarkivet:Exekvera metoder på rätt tråd.
UPPD: Begin/End Invoke på object som stream osv är för att vi skall slippa skriva trådplumbingen själva, det innebär tex inte att Callback metdoden som körs när invoke är klar på något sätt kör thread marshalling för att exekvera CBn på huvudtråden.Sv: Threading problem
Preics *S*, här kommer artikeln.Sv: Threading problem
Var vänlig och markera tråden som <b>Löst</b> och inte som <b>Stängd</b>. En tråd klassa som löst när den ursprungliga frågan fått ett svar som lett till en lösning. Stängd används när man öppnar en tråd som inte fått svar med lösning och man slutar hålla ett öga på tråden.