Routine "muori": un'istanza che distrugge sé stessa

mercoledì 01 settembre 2004 - 17.39

zami Profilo | Junior Member

Salve!
Stiamo realizzando a scopi didattici un'applicazione console tipo MUD.

Il problema si pone quando uno dei MOB deve essere eliminato.
Per capirci: istanziamo due tigri, il nome degli oggetti è tigre1 e tigre2.

Queste combattono, e una dev'essere eliminata ("muore"):
Qualcuno ha idea di quale possa essere il codice per la routine "muori"?

Abbiamo tentato con ME = NOTHING ma non funziona.
Visto che dall'esterno tigre1 = NOTHING cancellava l'istanza dell'oggetto, abbiamo cercato di creare un oggetto esterno ad hoc al quale passare ME come parametro ma neppure questo funziona.

Spero di essermi spiegata, non mi capisco nemmeno più da sola a quest'ora :P

Grazie comunque e ciao

Brainkiller Profilo | Guru

Ciao Miki,
questa applicazione Mud come è stata implementata ? Client / Server o gira tutto su un client ? Spiega un po'.

ciao
david

zami Profilo | Junior Member

Ciao David,

Per il momento è solo un processo che gira tutto su una macchina: se vediamo che riusciamo a fare qualcosa che valga la pena di portare avanti, sicuramente diventerà un'applicazione server alla quale si connetteranno dei client.

In effetti visto che siamo novizie assolute di questo tipo di programmazione stiamo procedendo un po' a braccio.....:)

Grazie
Michela

Brainkiller Profilo | Guru

Sarebbe l'ideale se tu postassi un pezzettino di codice per capire come istanzi le classi e come le chiudi, voglio capire il processo che deve compiere la povera tigre prima di morire :)

La programmazione per classi non è facilissima ed è difficile andare a braccio se poi si intersecano un'architettura client/server e un'applicazione Multithreading :-O diventa molto difficile.

ciao
david

zami Profilo | Junior Member

Con alcuni tagli, il codice che "gira" è questo che segue.
In fondo c'è una classe TESTER che contiene il metodo main: ne viene subito
istanziato un oggetto t e di questo si chiama il metodo RUN().

In run() ci sono per ora solo le dichiarazioni dei tre animali e l'attacco per adesso viene "forzato" a mano.

Il punto è che in fondo il drago attacca la tigre e la uccide: l'istanza viene settatta a
nothing dalla classe (ehm) Angelo_Della_Morte ma all'uscita, quando il controllo
ritorna nel Run, il drago attacca di nuovo QUELL'ISTANZA di tigre, e questa risulta
ancora esistente e funzionante: se invece si setta a NOTHING quell'istanza da
dentro il RUN, manualmente, scrivendo tigre1 = nothing, e dopo si tenta l'attacco,
viene generato errore (l'istanza non esiste più).

Grazie ancora!!

Brainkiller Profilo | Guru

Per evitare gli errori avete più modi o usare il Try..Catch oppure verificare ogni volta se una particolare istanza è istanziata o meno.
Evitate magari per le prime volte di mettere a Nothing l'instanza di classe se no viene terminta.

Verificate con il debug passo passo l'evoluzione del codice.

ciao
david

Caleidoscopio Profilo | Newbie

Se la tua Tigre1 è un'istanza di una classe....
dim x as new tigre1,
il metodo per "Killare" un oggetto in .net è x.dispose.
Spero ti aiuti....bye

zami Profilo | Junior Member

dunque è un po' che non ci rimetto le mani, ma ricordo che il metodo dispose non funzionava.... se non vado errata il dispose serve a chiamare forzatamente la garbage collection su qualcosa.... questa sera mi riguardo il codice e ti dico che errore mi dava. Intanto ti ringrazio!

Caleidoscopio Profilo | Newbie

Hai ragione, il metodo dispose chiama il garbage collector... però i tipi riferimento, come le classi vengono allocati nell heap e non nello stack, quindi il settare a nothing il valore di x (nell'esempio di prima) nn elimina l'oggetto, perchè il riferimento all'istanza nell'heap nn viene cancellato fino al "collect" automatico del garbage collector, che avviene quando il dominio di memoria dell'appl. nn è più sufficiente x farla girare....almeno se nn ricordo male....è un pò che nn ripasso....

zami Profilo | Junior Member

Confermo, esattamente..... ma quello che io andavo cercando non era l'effettiva distruzione dell'oggetto (quella risultante dalla garbage collection), ma il renderlo indisponibile all'interazione (passami la terminologia un po' frettolosa), risultato che ottenevo appunto settandolo esternamente a nothing.

Il problema nasceva quando doveva decidere lui stesso di essere settato a nothing..... cioè quando doveva passare sé stesso come argomento a un'istanza che lo settasse a nothing (mi sono capita?)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5