App.Previnstance

mercoledì 25 luglio 2007 - 15.26

allforum Profilo | Junior Member

Ciao a tutti,
non riesco a trovare il corrispondente in vb.net di
App.Previnstance
che utilizzo in VB6 per sapere se l'applicazione è già in esecuzione; in pratica:

Private Sub Form_Initialize() If App.PrevInstance Then End End Sub

Esiste il corrispondente in vb.net ?
C'è un metodo simile ?

Ciao e grazie.

SSUPERPIPPO Profilo | Guru

puoi utilizzare la classe Mutex del namespace System.Threading. Mutex verifica che in esecuzione esista un unico thread in base al nome passato come parametro stringa.

Esempio:

Imports System.Threading


Private Shared m As Mutex2

Private Sub Main()

Dim first As Boolean

m = New Mutex(true, Application.ProductName, first)
if (first) then

Application.Run(new MainForm()) ' Dove MailForm corrisponde al Form principale
m.ReleaseMutex()

else

MessageBox.Show("Applicazione già in esecuzione")

end if

End Sub

Ciao, Ale

allforum Profilo | Junior Member

.... scusami ma solo da pochissimo stò cercando di utilizzare vb.net ......

Non è che potresti spiegare meglio ..... magari da profano ?
In particolare non sò dove mettere

Private Shared m As Mutex2

Ciao.

SSUPERPIPPO Profilo | Guru

Ti posso dire come faccio io normalmente.

Ho creato un Modulo "Generale" che utilizzo per le dichiarazioni globali e che include anche la Sub Main()

' Prima importi il namespace

Imports System.Drawing

' Le rimanenti istruzioni seguono l'ordine sotto riportato

Module Generale()

Private Shared m As Mutex2

Private Sub Main()

Dim first As Boolean

m = New Mutex(true, Application.ProductName, first)
if (first) then

Application.Run(new MainForm()) ' Dove MailForm corrisponde al nome del Form principale da avviare
m.ReleaseMutex()

else

MessageBox.Show("Applicazione già in esecuzione")

end if

End Sub

End Module

Dovrai impostare sulle proprietà del progetto la Sub Main() come oggetto di avvio.

Spero di essere stato abbastanza chiaro...

Ciao,

Alessandro

SSUPERPIPPO Profilo | Guru

Scusa, ho scritto male...

non è

Private Shared m As Mutex2

ma

Private Shared m As Mutex

ho messo un 2 per errore.

Ciao
Ale

allforum Profilo | Junior Member

Perfetto! mille grazie.

L'unica cosa è che ho utilizzato
Private m As Mutex
invece di
Private Shared m As Mutex
perchè altrimenti mi segnalava errore.

Ciao e grazie.

sanbiz Profilo | Senior Member

Mi intrometto un po' in ritardo.
E' anche possibile usare questa funzione per "simulare" l'App.PrevInstance di VB6

Private Function PrevInstance() As Boolean
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
MsgBox(UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)))
Return True
Else
Return False
End If
End Function

O più semplicemente

Private Function PrevInstance() As Integer
Return UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName))
End Function

In questo modo se PrevInstance è > 0 oltre a sapere che l'istanza è in esecuzione posso anche ottenere il numero totale.
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

lucaGorizia Profilo | Newbie

Scusate il ritardo nell'intervenire in questa discussione ma non ho trovato altri thread riguardo all'argomento.
Mi servirebbe di bloccare il doppio avvio di un'applicazione (quello che avrei potuto fare in VB6 con
Private Sub Form_Initialize() If App.PrevInstance Then End End Sub
ma lavoro in VB.NET Framework 1.1.
Ho provato il codice postato da SSUPERPIPPO ma mi da un errore su Application.ProductName e mi dice che
"ProductName" non è un membro di System.Windows.Form.Application
(ma in realtà lo è: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.productname(v=VS.71).aspx).
Se scrivo "Application." mi suggerisce solo le opzioni: "DoEvents", "Exit", "Run".
Premesso che ho scritto all'inizio del codice "Imports System.Windows.Form.Application", perchè si comporta così?
Come posso fare?

Grazie per l'eventuale risposta
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