Hej, En tråd kan startas på två sätt; 1) Den är som en vanlig tråd, den måste avslutas innan programmet dödas totalt eller 2) Som background, den avslutas rakt av när programmet dödas, en backgorundthread har ingen inverkan på om programmet ska stängas av eller inte Mm, i Compact Framework kan man inte lägga trådar att köra i bakgrunden. Lösningen verkar onekligen vara det primitiva att ha en boolean som alla trådar tittar på i den while-sats som körs... =( Antingen det eller att helt enkelt avsluta tråden (det finns någon funktion på thread-klassen som är dödlig) Jaså... hmm. Jag tror på Thread.Join() och sätta false på din while loop. Ok, tittat lite på Thread.Join() men förstår inte hur jag ska använda den? Jag kanske missförstod diskussionen ovan, men jag fick för mig att du hade skapat några egna trådar med Thread klassen och att dessa körde en metod med en while loop. Du har förstått alldeles korrekt: ett antal trådar skapas i lite olika delar av programmet men jag tvekar på att samtliga är nåbara direkt från huvudklassen. Kan inte Client klassen ha en Dispose, Close eller Disconnect metod som städar upp dina trådar? Då kan huvudprgrammet anropa den metoden på respektive Client klass. Jag kom på felet:Avsluta trådat program; Application.Exit, Environment.Exit...
jag har skrivit en del program i C# .NET Framework 1.1 samt C# .NET Compact Framework 1.1.
Jag hade tidigare problem i .NET Framework att avsluta program - Application.Exit() fungerade inte (programmet låg fortfarande o körde) men Environment.Exit() fungerade utmärkt!
Problemet i Compact Framework är att Enviroment.Exit() finns inte med, endast Application.Exit() som inte heller fungerar där.
Frågan är hur man går tillväga? Programmet för CF är också trådat.Sv: Avsluta trådat program; Application.Exit, Environment.Exit...
Lösningen på ditt problem är att antingen se till att starta alla trådar som "stör" vid avslut som background eller att manuellt stänga av dem en efter en (loopa igenom alla och försök döda dem)Sv:Avsluta trådat program; Application.Exit, Environment.Exit...
Tack för tips!Sv: Avsluta trådat program; Application.Exit, Environment.Exit...
Sv:Avsluta trådat program; Application.Exit, Environment.Exit...
Jag har nu försökt med med att en public static bool _continue sätts till false när man klickar på Quit-knappen samt att aktuellt Form stängs Close().
Quit-knappen (som ligger i en panel i Client-formen):
<code>
private void quitButton_Click(object sender, EventArgs e)
{
client.Close();
}
</code>
Programmet startar med en Form (Loader) som i sin tur kör igång main-formen (Client). I denna main-form har jag på Closing-eventet:
<code>
private void Client_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Client._continue = false;
loader.Close();
}
</code>
I min preloader-formen (Loader), som faktiskt startar main-formen, står det:
<code>
private void Loader_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Application.Exit();
}
</code>
Det ser väldigt bra ut - programmet dör. Eller? För programmet går inte att starta efter att man avslutat det med ovanstående. Det tyder på att nåt inte stämmer ju.
Tankar eller ideér?
MVHSv: Avsluta trådat program; Application.Exit, Environment.Exit...
Sv:Avsluta trådat program; Application.Exit, Environment.Exit...
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemthreadingthreadclassjointopic1.asp
"Blocks the calling thread until a thread terminates.
Use this method to ensure a thread has terminated. The caller will block indefinitely if the thread does not terminate."
Hur, när och var använder jag detta i min beskrivning ovan? Ska jag göra en Thread.Join() ... var exakt?
Tacksam för lite hjälp =)Sv: Avsluta trådat program; Application.Exit, Environment.Exit...
För att avsluta en tråd kan du köra join på den, vilket innebär att tråden kommer slås samman med huvudtråden. Detta kommer bli ett serielt anrop, dvs. programlogiken pausas tills tråden har gått in i huvudtråden. Låt säga att din tråd heter t; då skriver du t.Join() där du vill att tråden ska avslutas, t.ex. när programmet ska avslutas.Sv:Avsluta trådat program; Application.Exit, Environment.Exit...
Loader skapar Client, och det är egentligen i Client som allt händer och sker. Loadern är bara en "preloader" så det ser lite snyggt ut när den laddar.
Men jag ska undersöka lite om det går att göra som du säger. ANdra tips och ideér (även gällande Join()) tas tacksamt emot =)
Det störiga är att efter sökt på Google en hel del hittar jag ingen som har samma problem som jag har: trots att jag kör med Close och Application.Exit, samt ser till att alla trådar tittar på en bool variabel är det nåt som stannar kvar när programmet är avslutat.
Jag kan alltså inte starta programmet igen efter att jag avslutat det. Jag sklickar på .EXE filen men inget händer. Irriterande...Sv: Avsluta trådat program; Application.Exit, Environment.Exit...
Sv:Avsluta trådat program; Application.Exit, Environment.Exit...
det var en GPS-grej som var tvungen att ta Dispose() på det objektet (som meckade med GPS:en).
Jag trodde det räckte att man satta en viss grej till false, men tydligen inte.
Nu avslutas programmet =)