Google Gruppi non supporta più i nuovi post o le nuove iscrizioni Usenet. I contenuti storici continuano a essere visibili.

chiusura applicazione non riesce

14 visualizzazioni
Passa al primo messaggio da leggere

Enzo

da leggere,
16 feb 2011, 07:31:2016/02/11
a
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

Franz_aRTiglio

da leggere,
16 feb 2011, 08:47:4116/02/11
a
Enzo wrote:

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

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.


Paolo opg

da leggere,
16 feb 2011, 08:53:0216/02/11
a
"Enzo" <i8...@libero.it> wrote in
news:SuP6p.46181$7b4....@tornado.fastwebnet.it:

[cut]


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

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

Wodka40[Google]

da leggere,
16 feb 2011, 09:37:4316/02/11
a
On 16 Feb, 13:31, "Enzo" <i8...@libero.it> 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!

Enzo

da leggere,
18 feb 2011, 09:48:5518/02/11
a
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???

Paolo opg

da leggere,
18 feb 2011, 10:00:0018/02/11
a
"Enzo" <i8...@libero.it> wrote in
news:wFv7p.47652$7b4....@tornado.fastwebnet.it:

[cut]


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

Enzo

da leggere,
18 feb 2011, 11:40:1518/02/11
a
> 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

Paolo opg

da leggere,
18 feb 2011, 11:56:3518/02/11
a
"Enzo" <i8...@libero.it> wrote in
news:Shx7p.47736$7b4....@tornado.fastwebnet.it:

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


facci caso, c'e' un mio reply al tuo primo post.


> 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
> spero di essere stato chiaro
>
>
>


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?

Paolo opg

da leggere,
18 feb 2011, 12:09:1918/02/11
a
Paolo opg <spamc...@tiscali.it> wrote in
news:Xns9E90B6873A61Esp...@193.43.96.1:

[cut]


>
>> 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
>> spero di essere stato chiaro
>>
>>
>>
>
>
> 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.

Wodka40[Google]

da leggere,
18 feb 2011, 15:45:5818/02/11
a
On 18 Feb, 17:40, "Enzo" <i8...@libero.it> 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

Wodka40[Google]

da leggere,
18 feb 2011, 15:59:2118/02/11
a
On 18 Feb, 21:45, "Wodka40[Google]" <virgultoamor...@latinmail.com>
wrote:

> On 18 Feb, 17:40, "Enzo" <i8...@libero.it> 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!

Wodka40[Google]

da leggere,
18 feb 2011, 16:14:4218/02/11
a
On 18 Feb, 21:59, "Wodka40[Google]" <virgultoamor...@latinmail.com>

wrote:
> On 18 Feb, 21:45, "Wodka40[Google]" <virgultoamor...@latinmail.com>
zac

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

Enzo

da leggere,
19 feb 2011, 11:43:5319/02/11
a

"Wodka40[Google]" <virgult...@latinmail.com> 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

0 nuovi messaggi