Gå til innhold

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


Anbefalte innlegg

Skrevet (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 :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
Videoannonse
Annonse
Skrevet

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.

Skrevet (endret)

prosessen har kun en thread :dontgetit:

 

EDIT: ja, jeg som er trådstarter. Flere maskiner her i huset, glemmer stadig å skifte bruker først

Endret av JeyKey
Skrevet

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.

Skrevet

Æ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.

Skrevet

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!

Skrevet

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.

Skrevet

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å.

Skrevet

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

Skrevet

Hehe, den er ikke så ille egentlig, synes det er veldig bra jeg... skriver like "rotete" selv :p

 

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)

Skrevet

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...

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

Endret av wolf5
Skrevet

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.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...