hej alla, Om funktionen anropas från fel tråd så anropar den sig själv i rätt tråd. InvokeRequired och BeginInvoke används i Windows Forms för att avgöra ifall en funktion har blivit anropad ifrån GUI tråden eller någon annan tråd. Det är ju så att man inte får röra några Windows Forms objekt (kontroller) om man inte är i GUI tråden. BeginInvoke gör då så att funktionen läggs i formens meddelande kö och kommer då att köras i GUI tråden där man kan göra vad man vill med sina kontroller och GUI-objekt. Tack så väldigt mycket för ert svar. Det är precis det de menar...InvokeRequired returnerar True om det inte är GUI-tråden som kör, då krävs alltså att man med Invoke anropar samma funktionen igen, men denna gång bli det via GUI-tråden, och då returnerar InvokeRequired false och funktionen kör den kod som man egentligen ville utföra. Tack så mycket, Förutom exemplen jag skrev om ovan så glömde jag det kanske vanligaste och det är om du startar en bakgrundstråd (worker thread) som ska göra något och samtidigt uppdatera kontroller (en förloppsindikator tex) i GUI tråden. Bakgrundstråden jobbar ju då inte i GUI tråden och kan inte direkt pilla på komponenter och kontroller i GUI tråden i en form.C# kod fråga
vad betyder följande kod? anropar man en metod inne i själva methoden igen? rekursiv? eller ?
public void UpdateChatForm(string username, string msg, string uri)
{
if (InvokeRequired) //strunta i if-statsen
{
this.BeginInvoke(new UpdateChatFormDelegate(UpdateChatForm),
username, msg, uri);
return;
}
}
TackSv: C# kod fråga
(en sidoeffekt är att funktionen blir asynkron)
GUI-kontroller måste uppdateras från den tråd de skapades i.
Kontrollerna finns i en särskild SecurityContext som gör att BeginInvoke byter till kontrollens tråd (normalt använder BeginInvoke threadpool)Sv: C# kod fråga
Vissa timers, serieportar, asynkron IO och file notofiers är exempel på funktioner som kan starta events som inte körs i GUI tråden.
/Ruben
www.rjjournal.netSv:C# kod fråga
jag har inte jobbat med Windows forms mycket och förstår inte riktigt vad ni menar med "en funktion har blivit anropad ifrån GUI tråden eller någon annan tråd"
menar ni att själva application är GUI tråden och om jag själv gjort en tråd som körs parallellt och anropat metoden??
tackSv: C# kod fråga
Jag är dock van vid att den brukar se ut ungefär så här (men det finns väl olika metoder, syftet är dock detsamma):
public void UpdateChatForm(string username, string msg, string uri)
{
if (InvokeRequired)
{
this.Invoke(new UpdateChatFormDelegate(UpdateChatForm),
username, msg, uri);
return;
}
else
{
// Får inte anropa en listview från andra trådar än GUI-tråden
// Här gör du något användbart med parametrarna username,msg och uri.
listView1.Items.Add(username + " skrev : " + msg);
}
} Sv:C# kod fråga
vad som jag inte kan föreställa är att hur en method kan anropas utanför GUI-tråden. Om detta är en Windows application, så alltid methoden anropas från GUI-tråden, eller?
en annan senario är att kanske man har reference till det från annan application.
jag vet inte jag måste läsa lite om trådar och processer.
tack Sv: C# kod fråga
Innan dot net så löste man det här med PostMessage i den anropande funktionen (bakgrundstråden), nu använder man BeginInvoke i den anropade funktionen istället. Resultatet blir detsamma - ett meddelande läggs i GUI trådens meddelande kö och funktionen kopplad till det meddelandet kommer då att vara i GUI tråden när den körs (när meddelandet hanteras av kö hanteraren). Man kan säga att det är en slags synkronisering av anrop till funktioner i GUI tråden.
/Ruben
www.rjjournal.net