Gå til innhold

C#: Snake-spill, problemer med å avslutte prog.


Anbefalte innlegg

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 :innocent:

 

EDIT: og ellers er ikke spillet ferdig, og har noen bugs jeg ikke har fikset enda, bl.a. med poenggivning

Multiplayer_snake.zip

Endret av hockey500
Lenke til kommentar
Videoannonse
Annonse

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

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

Æ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

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

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

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! :cool:

Endret av wolf5
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...