hockey500 Skrevet 21. november 2006 Del Skrevet 21. november 2006 (endret) Heisann, jeg holder på å lage et mutiplayer snake-spill, med opptil 5 spillere. Se vedlagt fil for kode og kjørbar fil. Problemet kommer når man skal avslutte spillet, for da fortsetter nemlig tråden å kjøre i bakgrunnen. Det jeg gjør for å avslutte spillet er ganske enkelt å kjøre Application.Exit eller Application.ExitThread når brukeren klikker Esc for å avslutte, ingen av delene funker. Vinduet lukker seg, men prosessen fortsetter. Dette er ikke et problem hvis man avslutter spillet FØR man har klikket Space for å begynne spillet, dvs. hvis man klikker Esc mens man fremdeles velger hvilke spillere som skal være med. Noen som har noen tips til hva jeg kan gjøre for å få drept prosessen skikkelig? I tillegg til dette har jeg et annet, litt mindre problem. Dette problemet løser egentlig seg selv hvis jeg får løst det første problemet. Det andre problemet er at jeg får en Exception hvis jeg gjør følgende: 1: velger brukere, klikker space for å begynne 2: trykker Esc for å gå tilbake til å velge brukere 3: velger brukere, klikker space for å starte Men dette er ikke et problem for øyeblikket, fordi jeg bruker Application.Restart for å gå tilbake til å velge nye brukere, noe som fungerer fint. Problemet med å bruke Application.Restart er at det starter en ny prosess, og siden prosessen ikke avslutter seg (som er problem 1), får man etter hvert mange prosesser. Kanskje litt vanskelig å forstå hva jeg mener uten å prøve spillet, jeg legger ved koden til spillet i tillegg, hadde vært fint om noen ville ta seg litt tid til å se på det EDIT: og ellers er ikke spillet ferdig, og har noen bugs jeg ikke har fikset enda, bl.a. med poenggivning Multiplayer_snake.zip Endret 21. november 2006 av hockey500 Lenke til kommentar
wolf5 Skrevet 23. november 2006 Del Skrevet 23. november 2006 Uten å ha lest koden ville jeg sørget for at ALLE tråder jeg oppretter som har en evig løkke (eller langtlivet levetid) har periodiske sjekker på en boolsk variabel på om de skal avslutte seg selv. F.eks lag en statisk public bool "ApplicationRunning" eller noe i Program.cs. Denne sjekker du mot i alle tråder du har som da vil avslutte på en fin måte når denne settes til false i exit koden din. Det er ikke fint å knerte tråder slik du har prøvd, selv om det strengt tatt ikke gjør noe når applikasjonen likevel er ferdig. Lenke til kommentar
JeyKey Skrevet 24. november 2006 Del Skrevet 24. november 2006 (endret) prosessen har kun en thread EDIT: ja, jeg som er trådstarter. Flere maskiner her i huset, glemmer stadig å skifte bruker først Endret 24. november 2006 av JeyKey Lenke til kommentar
wolf5 Skrevet 24. november 2006 Del Skrevet 24. november 2006 Istedet for Application.Run i starten av applikasjonen din, bruk heller en løkke med samme logikk jeg har nevnt. alstå ikke: Application.Run(new MainForm()); men new MainForm().Show(); while(ApplicationRunning){ Application.DoEvents; System.Threading.Thread.Sleep(1000); } og i exit code setter du denne til false. Lenke til kommentar
hockey500 Skrevet 24. november 2006 Forfatter Del Skrevet 24. november 2006 skjedde det samme, lukket programmet, men avsluttet ikke prosessen Lenke til kommentar
GeirGrusom Skrevet 24. november 2006 Del Skrevet 24. november 2006 Ærlig talt, vet jeg ikke hvorfor du har laget en ekstra thread her, siden det åpenbart bare skaper problemer. Du kan også prøve å ikke kalle Application.Exit, dette er egentlig ikke sånn det skal gjøres, heller la programmet "avslutte av seg selv". Forresten, hvis du vil ha litt bedre grafikk (kantutjevning) kan du jo tegne ellipser istedet, og sette på SmoothingMode til AntiAlias. Lenke til kommentar
hockey500 Skrevet 24. november 2006 Forfatter Del Skrevet 24. november 2006 Ja, du kan gjerne fortelle meg hvor denne ekstra threaden kommer fra, for jeg ser kun én. Har du noen bedre forslag til hvordan jeg kan avslutte et program, siden det ikke er noe kryss i høyre hjørne for brukeren til å klikke på? Det skal jeg prøve, ja! Lenke til kommentar
wolf5 Skrevet 24. november 2006 Del Skrevet 24. november 2006 Det kan jo ha noe med denne koden å gjøre: void StartGame() { ... System.Threading.Thread.Sleep(20); // 30 StartGame(); } Veldig enkelt å debugge seg frem til dette. Når du velger avslutt i spillet så ser du fremdeles at applikasjonen kjører (for du kan ikke endre i kode). Så trykker du bare pause knappen for å se hvor koden kjører for øyeblikket. Lenke til kommentar
GeirGrusom Skrevet 24. november 2006 Del Skrevet 24. november 2006 Programmet skal egentlig kjøre slik: Begin Application LoadData Begin Loop Func(...) If EndGame Then Exit Loop Loop FreeMemory End Application Hvis jeg gjør meg forstått; Så når programmet er ferdig, så hopper den bare ut av alt av løkker, dette for å sikre at alt som skal avsluttes, blir avsluttet slik programmereren vil, og at alt frigjøres og behandles riktig. Det er selvsagt veldig mye enklere å skrive Application.Exit, men det er en veldig "skitten" metode å gjøre det på. Lenke til kommentar
hockey500 Skrevet 24. november 2006 Forfatter Del Skrevet 24. november 2006 wolf5: Det er en litt eldre versjon av koden, nå kjører jeg ikke lenger en rekursiv funksjon. Geir: problemet er vel da at jeg må skrive om hele koden, hvis jeg forstår deg rett. Koden min nå er ikke akkurat veldig oversiktlig og ryddig Lenke til kommentar
GeirGrusom Skrevet 24. november 2006 Del Skrevet 24. november 2006 Hehe, den er ikke så ille egentlig, synes det er veldig bra jeg... skriver like "rotete" selv Det er ikke så mye som skal til, og det er ikke en nødvendighet, men jeg tror du kunne ungått noen feller på den måten (f.eks. threading problemet ditt) Lenke til kommentar
hockey500 Skrevet 24. november 2006 Forfatter Del Skrevet 24. november 2006 Jaja, vet ikke om jeg gidder å skrive om hele koden, og når jeg ikke egentlig vet hva jeg må gjøre for å fikse det tror jeg bare at jeg glemmer hele saken. Får vel leve med å måtte avslutte prosessen manuelt da... Lenke til kommentar
wolf5 Skrevet 24. november 2006 Del Skrevet 24. november 2006 (endret) Får vel hjelpe deg å få knertet den om du ikke klarer å sprette ut av hovedtråden på et vis. public static void KillMyself() { int procid = Process.GetCurrentProcess().Id; int num1 = OpenProcess(0x1f0fff, 0, procid); TerminateProcess(num1, 0); } [DllImport("KERNEL32.DLL")] private static extern int OpenProcess(int dwDesiredAccess, int bInheritHandle, int dwProcessId); [DllImport("KERNEL32.DLL")] private static extern int TerminateProcess(int processid, int exitcode); Kjør den når du avslutter. Da drepes programmet effektivt. Stygg måte, men effektiv. Det samme som å gå i taskmanager->prosesser og "Avslutt prosess" på programmet. WIN32 API POWAH! Endret 24. november 2006 av wolf5 Lenke til kommentar
hockey500 Skrevet 25. november 2006 Forfatter Del Skrevet 25. november 2006 Den funka fint ja, men finnes det en måte å få den til å inngå i Application.Restart på, på en eller annen måte? hadde vært litt praktisk det og. Lenke til kommentar
wolf5 Skrevet 25. november 2006 Del Skrevet 25. november 2006 Du får mekke din egen ApplicationRestart() som gjør begge deler. Application.Restart er en del av Framework og er en kodedel du ikke kan endre. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå