Newsgroup: it.comp.lang.visual-basic
Titolo: chiusura applicazione non riesce

Nella mia applicazione vi sono vari possibili form principali di partenza e 
di conseguenza durante l'esecuzione, ho la possibilità di poter cambiare 
questi form. Il problema e che non riesco ad eliminare dalla memoria fisica 
del computer il thread in esecuzione, con la conseguenza che dopo aver 
aperto 3 o 4 forms principali mi ritrovo con 3 o 4 applicazioni in 
esecuzione.
in application events
Partial Friend Class MyApplication
        Public Sub MyApplication_Startup(ByVal sender As Object, ByVal e As 
Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles 
Me.Startup
            AboutBox.ShowDialog() si connette ad un'apparecchiature e mostra 
le varie fasi
            Dim value As Object
            value = CaricaForm()   va a vedere in my.setting.nomeform quale 
deve essere caricato
            Application.MainForm = value
        End Sub
in questa vado a visualizzare quale pagina scegliere
Private Sub CmdSceltaStrumenti_Click(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles CmdSceltaStrumenti.Click
        FrmSceltaStrumenti.ShowDialog()
        Dim value As Form
        value = CaricaForm()
        If value.Name <> Me.Name Then viene eseguita questa parte solo se ho 
scelto un form differente
            Application.Exit()                  qui non cancella dalla 
memoria il mio file.exe
            Application.Restart()            il quale rimane sempre in 
esecuzione
        End If
spero di essere stato chiaro qual'è il mio problema e vi chiedo come poter 
chiudere completamente il programma in esecuzione, prima di farlo ripartire 
con un nuovo form
    End Sub 

 con 3 o 4 applicazioni in esecuzione.
Non ho mai verificato con .net, ma in vb6 mi da' questo tipo di 
problematiche
se ci sono eventi associati a dei timer; per risolvere prima spengo tutti i
timer con un semplice trucco: una variabile globale booleana "AppIsClosing"
che quando messa a true impone a tutti i timer di autodisabilitarsi
Public Sub MyTimer()
If AppIsClosing then MyTimer.Enabled = False ' da mettere in tutti i timer
...
End Sub
ovviamente nella subrountine che che genera l'equivalente di 
Application.Exit()
ho messo un ritardo di 1 secondo tra appisclosing=true e il comando 
arresta/riavvia
programma.

 
io ci ho capito poco e niente...
:-)
se stai usando .net, .exit richiama la chiusura di tutti i form: non e' che 
ti crea casini col fatto che lo richiami proprio da una form?
provato a lasciare il solo application.restart?
e sostituire il .exit con la chiusura manuale di ogni singola finestra per 
capire se/dove si intoppano la chiusura o il riavvio?
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 wrote:
zac
Una form è una classe
una classe istanziata un oggetto....
un oggetto non lo elimina il gc  finchè ho qualcosa che lo tiene vivo.
Inoltre se anche non fosse vivo...non è detto che lo elimini subito
dalla memoria.
Tu però parli di Thread...
essi a maggior ragione vivono in quanto lanciati o PARTE di un altro
thread scatenante.
Se parli di thread...qualcosa li tiene vivi!...e comunque ci sarebbe
threadpool per gestire thread multipli!
e poi...che senso ha application.exit...e a ruota application.restart?
Considera che nel mentre la chiudi....lui non fa a tempo a farlo che
arriva un altra richiesta di esecuzione....NON hai (probabilmente
perchè non vuoi) un controllo singleton sull'istanza in esecuzione
E per me che succede?
Succede questo:
Applicazione ...chiudi
Ok...cerco le finestre da chiudere e la roba da uccidere
MA...che fai...mi riavvi?
Allora un po di tempo lo dedico a riavviare....
ma io sto continuando a chiudere....
ma io sto riavviando....
io chiudo al form "pippo"...ma io la sto riaprendo...e allora non la
chiudo...no dai chiudi...no no...
morale della favola
App1 non chiude...ed App2 si avvia....2 App in esecuzione!
metti un ble msgbox fra app.exit e app.restart
il msgbox sospende...controlla..vedrai che se tutto è ok...app1
muore...adesso premi ok sul msgbox....app2 nasce.....
sempre che tutto sia stato programmato correttamente!

Le ho provate di tutte ma purtroppo niente da fare.
Ho bloccato tutti i timer in esecuzione in quel momento sul form
non ho la possibilità di chiudere manualmente il form
perche il bordo del form è disabilitato e deve rimanere tale
Credevo che potesse essere VS in esecuzione in quel momento
visto che sto lavorando in debug. Quindi ho compilato ed avviato 
direttamente
l'eseguibile. Dopo tre o 4 restart mi ritrovo in memoria 3 o 4 eseguibili
Ho atteso che vi fosse un garbage collection, ma l'unica cosa che è riuscita
a garbagiare.............non ve la dico.
eppure da msdn
application.restart()
Arresta l'applicazione e avvia immediatamente una nuova istanza.
mi soffermo un'attimo su arresta l'applicazione, forse intende dire che ne 
fa un bidone di copie in memoria
e se le tiene li fino a quando non scoppia quella fisica e quella virtuale.
La prendo a ridere ma il problema da affrontare per me è grosso veramente, 
ho circa 8 tipi di strumentazioni visualizzabili e se
l'utente finale in una sessione si vuole divertire a cambiare pagina una 
decina di volte per ogni tipo di strumentazione
immaginate gli eseguibili che restano in memoria, oltretutto non è un hd 
normale da 500 Gb e piu ma un HD statico da 8 Gb.
come ultima spiaggia, ma sinceramente non vorrei utilizzarla e quella di 
fare un restart del computer
Chi mi da una mano a risolvere il problema???
 

 
scusa ma... chiarito che la soluzione che hai trovato tu per il tuo 
problema non funziona, non ti conviene descrivere il problema invece di 
intestardirti su una soluzione che pare non funzionare?



bhe se leggi il primo msg è spiegato il problema, se vai alla fine, 
chiaramente non si riesce a capire niente e se leggi tutte le risposte 
precedenti ti fai un'idea.
comunque in modo semplice questo il problema
lancio il mio exe
chiudo il programma tramite una funzione  e faccio application.restart
il primo exe non viene cancellato dall'esecuzione ed apre un nuovo programma
Come faccio a saperlo??? CTRL+ALT+CANC
e vedo cosa c'è in esecuzione
se esegue 5 volte application.restart ci sono 5 exe in esecuzione
dello stesso programma


 
ancora una volta stai ridescrivendo la soluzione che hai messo in piedi e 
che pare non funzioni.
te la taglio piu' sottile.
perche' ti ostini a fare un application restart invece di scaricare 
semplicemente la form e rilanciarne un'altra?


 
n.b.: la domanda non e' fatta per dire 'hai trovato la soluzione sbagliata 
e devi mollarla', ma perche' se devi riavviare l'eseguibile ci sara' un 
motivo.
magari un componente che ti obbliga a riavviare per liberare una risorsa.
giusto quel dettaglio che tu dai per scontato ma che sul ng nessuno sa.
e che magari e' un po' fondamentale per spiegare il perche' di quello che 
ti succede.


 wrote:
zac....
allora il mio approccio è diverso dal tuo e ci vuole abbastanza tempo
a spiegarlo...provo a farlo diviso in due post!
Ti premetto che ho provato tutto in una applicazione di esempio che
poi ti illustrerò!
Allora....
a me non torna parecchio cose di quello che affermi...compreso i
termini
Tu parli di Form...ma poi inizi a parlare di processi.
A meno che la tua applicazione non sia parecchio articolata e multi-
threadineg per scelta progettuale....perchè hai tanti processi???UNO
ne hai ...e uno ne mantieni!
Quindi ha iniziato a pesare che cavolo potrà mai essere la tua
applicazione...ed ho acceso la palla di cristallo....
tu parli di strumenti....
ho pensato allora che tua vessi sviluppato tante applicazioni ...che
sò una che gha un DSP...una che gestisce una sceda I/O...una che
gestisce un convertitore tensione/frequenza etc etc
Ed allora chiudere la form potrebbe non bastare...sopratutto se poi
hai driver o controlli unmanaged!
ed allora mi son preso vs 2010 e butatto giu una mini app sega
passi...
progetto winform...ho lasciato il nome...mi ha proposto
WindowsApllication1
sono andato in proprietà del progetto ed al pannello "applicazione" ho
cliccato su visualizza eventi applicazione
mi ha creato ApplicationEvents.vb...lasciamolo stare per ora!
Il codice della form1
Public Class Form1
    Private _qualcosa As String = ""
    Public WriteOnly Property Titolo
        Set(ByVal value)
            _qualcosa = value
        End Set
    End Property
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim t As Graphics = Me.CreateGraphics
        t.DrawString(_qualcosa, New Font("ARIAL", 12),
Brushes.DarkRed, New PointF(x:=100, y:=100))
    End Sub
End Class
la form ha una proprieta writeonly che impostata stampa una stringa
dentro la form....nulla di che!
Ora riprendi applicationEvents.vb e incolla
 Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As
Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles
Me.Startup
            'L'array che conterrà i paramteri
            Dim MyStartupArguments() As String
            'Un contatore
            Dim intCount As Integer
            'Carico l'array
            MyStartupArguments = System.Environment.GetCommandLineArgs
            'Per ogni parametro mostro una MessageBox con il suo
valore
            For intCount = 0 To UBound(MyStartupArguments)
                Form1.Titolo = (MyStartupArguments(intCount).ToString)
            Next
        End Sub
è grezzissima ma in buona sostanza non fa che leggere da riga di
comando dei parametri e passarli alla famosa proprietà di sopra....
Basta compila!
Adesso abbiamo una applicazione che lanceremo richiamando l'exe e
passandogli dei parametri da linea di comando....!
Simula una applicazione che monitorizza un led ...ad esempio!...o che
stampa in background qualcosa...o quel che vuoi tu!
Fine prima parte

 wrote:
seconda parte
il manager
Facciamo un altra applicazione winform
Il nome me lo faccio dare da VS2010 : WindowsApplication2
Nella form mettiamo  3 pulsanti...
button 1
button 2
button 3
Button1 e Button2 lancerrano 2 exe di windowsapplication1 e Button3
chiuderà la seconda istanza di WindowsApplication1....
Chiamali come vuoi io il button3 l'ho chiamato Kill 2
ora incolla
Public Class Form1
    Dim t1 As New DateTime
    Dim t2 As New DateTime
    Dim t As Process
    Dim WithEvents p As Process
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
        If t Is Nothing Then
            t = New Process
        Else
            t.Kill()
            t.Dispose()
        End If
        t.StartInfo.Arguments = "TEST1"
        t.StartInfo.FileName = "C:\LavoriWeb
\WindowsApplication1\WindowsApplication1\bin\Debug
\WindowsApplication1.exe"
        Try
            t.Start()
            t1 = t.StartTime
        Catch ex As Exception
        End Try
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button2.Click
        If p Is Nothing Then
            p = New Process
        Else
            t.Dispose()
            p.Dispose()
        End If
        p.StartInfo.Arguments = "TESt_altraform"
        p.StartInfo.FileName = "C:\LavoriWeb
\WindowsApplication1\WindowsApplication1\bin\Debug
\WindowsApplication1.exe"
        p.EnableRaisingEvents() = True
        Try
            p.Start()
            t2 = p.StartTime
        Catch ex As Exception
        End Try
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button3.Click
        p.CloseMainWindow()
    End Sub
    Private Sub p_Exited(ByVal sender As Object, ByVal e As
System.EventArgs) Handles p.Exited
        'qui abbiamo le info sul processo chiuso
        Dim pp As DateTime = p.ExitTime
        MessageBox.Show("Processo attivo per " +
(pp.Subtract(t2)).ToString)
    End Sub
End Class
ctrl+alt + canc....metti il task manager aperto sul desktop compila ed
esegui...
clicac su button1...vedrai arrivare il processo WindowsApplication1
clicca su Button2...vedrai arrivare UN ALTRO processo
WindowsApplication1
clicca su Kill2....vedrai rimosso dai processi quello relativo al
button2!
Spiegazioni
USO PROCESS...per monitorare quello che eseguo!
    Dim t As Process
    Dim WithEvents p As Process
uno dischiarazione ha withevents perchè voglio intercettare gli eventi
di quel processo...MA NON BASTA....
perchè gli eventi siano intercettabili da vb occorre
 p.EnableRaisingEvents() = True
con questa dichiarazione io posso invocare
 p.CloseMainWindow()
che attraverso al coda di windows manda un segnale di "chiudi la
finestra" al processo...
e subito dopo la chiusura scatena l'evento exited
i processi hanno la possibilità di registrare time di inizio e time di
fine (addirittura il time di stop)...e molto altro....
io l'ho usato per farti vedere quanto la seconda finestra è rimasta
attiva
TUTTO MOLTO GREZZO e didattico
avevo necessità di farti vedere il concetto....su un esempio che
davvero funziona!
E' una base su cui raffinare molto!
Saluti!

         End If
zac
Abbi pazienza ma ti ho postato nella foga una versione vecchia
  If p Is Nothing Then
            p = New Process
        Else
            Exit Sub
   End If
quella giusta....è un grezzissimo "singleton de noartri"...ti fa
lanciare una volta sola l'applicazione anche se schiacci 20 volte sul
bottone!
va fatto anche sopra
        If t Is Nothing Then
            t = New Process
        Else
            Exit Sub
        End If
...sorry...la fretta!

 ha scritto nel messaggio 
news:c38c34e3-8acd-40d7...@m13g2000yqb.googlegroups.com...

so che è difficile spiegare il problema a parole forse sarebbe stato piu 
semplice se avessi potuto inserire un'immagine
comunque il form è unico in esecuzione e l'applicazione anch'essa unica. 
Quando ho parlato di thread ho sicuramente
sbagliato. In effetti il form deve visualizzare degli strumenti analogici 
quali contagiri, press olio e altro ancora. L'approccio
è stato sicuramente sbagliato ed in effetti ho corretto il problema, visto 
che la meta del form ha pulsanti comuni a tutti
i form mentre cambiano solo gli strumenti visualizzati, o utlizzato degli 
usercontrol e tenendo un solo mainform con un
contenitore (panel) dove vado ad inserire la classe derivata degli 
strumenti.
Ma anche in questo caso ci sono dei problemi che spiego in altro post. 
Ringrazio comunque tutti delle risposte e dell'interessamento
AH se non ci fosse questo NG