Newsgroup: it.comp.lang.visual-basic
Titolo: Programma che rimane in memoria

Ciao a tutti,
ho alcuni programmi che rimangono caricati in memoria.
Da questi programmi si può uscire o con F1 o con la X di windows.
Al form principale di ogni programma ho messo nell'unload (trovato su
google), ma credo che in qualche caso non funzioni.
Avete idea di quali problemi potrebbero esserci? Il fatto è che a me non
capita mai, solo a qualche cliente succede, e non sono riuscito a capire
quali operazioni fanno per lasciarlo caricato in memoria.
Grazie
Private Sub Form_Unload(Cancel As Integer)
Dim frm As Form
On Error GoTo esci
For Each frm In Forms
  Unload frm
Next
Set frm = Nothing
esci:
End
End Sub

 End Sub
Che voi sappiate potrebbe essere un problema se mi scarica prima il FrmMain
degli altri form eventualmente aperti? Altimenti potrei fare:
Private Sub Form_Unload(Cancel As Integer)
Dim frm As Form
On Error GoTo esci
For Each frm In Forms
  if frm.Name <>"FrmMain" then  
    Unload frm
  endif
Next
Set frm = Nothing
esci:
unload FrmMain
set FrmMain = Nothing
End
End Sub

Il giorno Tue, 21 Mar 2006 16:36:30 GMT, Andrea <nos...@invalid.invalid> ha
scritto:

Prova a mettere il 
Set frm = Nothing
all'interno del loop e non dopo il Next

 Avete idea di quali problemi potrebbero esserci? Il fatto č che a me non


 Comunque metti anche Set frm = Nothing all'interno del ciclo
Infatti proverò a scaricare frmMain per ultimo, mettere il nothing
all'interno.
Il fatto è che a me non succede mai, ma forse perchè seguo l'input standard
e non passo da alcune parti... Comunque male non fa, vedrò se i clienti
hanno ancora problemi.
Conoscendo il nome dei processi, posso killarli forzatamente come faccio
col task manager? Vorrei fare una procedura di emergenza.
Grazie

Il Thu, 23 Mar 2006 09:39:37 +0100, Gianricus ha scritto:

Con le API puoi farlo, ad esempio usando TerminateProcess, ti basta sapere
l'handle.
Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal
hProcess As Long, ByVal uExitCode As Long) As Long
Però potresti avere poi problemi se qualche operazione non si è ancora
completata, meglio aggiungere uno Sleep e dare il tempo al programma di
chiudersi correttamente con la routine che avevi scritto.

 quali operazioni fanno per lasciarlo caricato in memoria.
Il problema si presenta sostanzialmente per due motivi:
1) un form non è scaricato ma solo nascosto.
Questo lo risolvi con un ciclo come quello da te indicato, ma lo ritengo più 
una pezza che la soluzione: i form si dovrebbero scaricare da soli se non 
sono modali o con un Unload dopo la .Show vbModal.
L'ordine di scaricamento non è importante: quando l'ultimo è chiuso 
l'applicazione esce dal ciclo principale e muore.
2) Tutti i form sono scaricati o comunque è stato richiesto loro di essere 
scaricati.
Probabilmente l'app non muore perchè da qualche parte c'è un loop che 
continua a girare tenendola in vita.
In genere questo problema lo si nota perchè in un ciclo l'app sembra 
inchiodarsi e si ha che l'effetto "l'applicazione non risponde", a meno che 
nel loop non ci sia un bel DoEvents che da all'utente l'impressione che 
tutto va bene ma in realtà nessuno può dirlo.
Il terso motivo è decisamente più raro: una di queste cose avviene in un 
componente esterno (classe o controllo) e qui hai poco da fare: o hai i 
sorgenti e controlli i due casi sopra o killi l'app.
Ciao 

 sorgenti e controlli i due casi sopra o killi l'app.
Questo non credo ad occhio, o perlomeno tendo ad escluderlo perchè se fosse
così me ne sarei accorto anche io, sembra più qualche problema da risolvere
in caso di "utente sbadato" che usa il programma in maniera non precisa.

 in caso di "utente sbadato" che usa il programma in maniera non precisa.
Purtroppo l'utente ha tutto il diritto di essere sbadato.
Ciao 

 form per vedere se ad ogni load corrisponde il corrispondente unload.
Ti ringrazio, per ora provo se col set nothing non hanno più problemi.
In caso persistano userò un log come mi hai consigliato.
Grazie

 ha scritto nel messaggio
news:187222hpbshps5ves...@4ax.com...

usi la shell e poi chiami taskkill.exe /im /f <nome processo da killare>
Ciao
Pow

 In caso persistano userò un log come mi hai consigliato.
I problemi sono rimasti.
Mi sono però accorto che in qualche progetto ho un 
cmd_esci_Click
 end
end sub
E su google ho trovato che in quel modo salta l'unload, e quindi la mia
routine di scaricamento delle form.
Ora provo mettere un po' di ordine e vediamo se il problema si ripresenta.