Hallå, Nej du får inte slå av det. Det är ett kontroll system som håller igång fönsterhanteringen. du ska aldrig uppdatera grafiska saker från trådar. ;) Så förslaget är att lagra den nya informationen i objektet men inte rita ut den (förrän man tex går in på den grafiska tabben) eller har jag missförstått? Nej, Så jag ska skapa och uppdatera koden via delegater (eftersom de inte bryr sig om vart ifrån jag kör koden).Threading
jag har skapat ett fönster med 2 tabbar. Ena tabben har en DataGridVeiw den andra har ett grafiskt objekt jag skapar själv. Vid skapandet och ibland under körning läser jag om informationen de bygger på (dvs griden ska populeras om och det grafiskt objektet göras om). Att köra det grafiskt objektet i en tråd var inga problem första gången. Däremot när jag försöker att rita om objektet så får jag ett Cross thread access control fel (för att grundobjektet inte är skapat i samma tråd) Samma fel får jag när jag försökker cleara och populera om DataGridViewn så slår Cross thread access controlen in och säger att tråden inte gör det på ett säkert sätt. Då gridden/det grafiska objektet inte visas eller anropas av något annat när det körs i en tråd så är det ju en "säker" operation.
Vågar jag slå av CheckForIllegalCrossThreadCalls?
Var gör jag det i sådana fall?
Som ni förstår är jag inte så hemma på threading men är väldigt tacksom för hjälp.Sv: Threading
Läs mer här: http://www.lowendahl.net/content.aspx?cshrpContent=csa31Sv: Threading
gdi objekt allokeras per tråd och om du från en tråd försöker göra något som får en kontroll att rita om sig så kan det bli kecka.
det du kan göra är att i din bakgrundstråd lagra ut din upplästa data och sedan marshalla anropet från bakgrundstråden till maintråden och där först binda din nya data till kontrollerna
tex:
void MyThreadLoop()
{
while(appRunning)
{
....
lock(threadData)
{
this.ThreadData = bla;
}
myGrid.BeginInvoke ( SomeMethod); <-- där mashallas anropet över till maintråden
}
}
void SomeMethod()
{
lock(threadData)
{
grdData.yaddayadda = ThreadData;
}
}
dock kommer detta resultera i att det blir lite slöare eftersom kontrollerna får binda om sitt data.
men det får man leva med.
det går ju även göra div kösystem för att slippa locka samma objekt etc.
men det där fungerar iaf.Sv: Threading
Fast jag tog inte upp ngt om trådsynkronisering. Det är en helt annan disskusion än threadmarshalling :)Sv:Threading
Problemet är att det rör sig om ganska mycket data som ska visas på två olika sätt (i tabell och grafiskt) och det tar ca 30 sekunder per tabb att visa det. Därför tänkte jag att den icke aktiva tabben kunde köras i bakgrunden. Harn i andra förslag hur man kan lösa detta?Sv: Threading
du måsta använda delegater för att skickar över exekveringen av koden som uppdaterar kontrollen till huvudtråden.
Läs min artikel och de referrerade resurserna så ser du hur det hänger ihop.Sv:Threading
Så för min grafik tab så gör jag en delegat för att ta bort gamla objekt(jag vill/kan inte uppdatera eftersom det kan skilja en hel del) och en delegat för att lägga till de nya. Sen kör jag ändringarna i en tråd men via delegaterna? Och delegaterna ligger i parent klassen till grafikobjektet?