Apertura multipla istanze programma c#

lunedì 13 ottobre 2008 - 16.34

schumy2000 Profilo | Junior Member

Salve
ho un problema nel mio programma.
Essendo un software su palmare quando clicco il tasto di avvio del software è possibile che faccia partire più istanze del mio programma facendolo così impazzire.
C'è un modo per impedire che si aprano più "copie" del mio programma, qualcosa che si accorga che il programma è già stato avviato e ignora le eventuali altre aperture del programma??
Ho girato mezzo mondo ma non ho trovato nulla.
Siete la mia ultima speranza.

Grazie, Ciao.
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

aiedail92 Profilo | Expert

Ciao

Non so se sono supportati dai sistemi operativi dei palmari, se è così puoi utilizzare un Mutex. Ne avevamo già parlato su un altro thread (anche se se il codice era in VB.Net), ti rimando al link:

http://www.dotnethell.it/forum/messages.aspx?ThreadID=24582

Il codice da usare è quello dell'ultimo messaggio perchè nell'altro link mancavano delle istruzioni per il corretto funzionamento.

Se hai problemi nel tradurre in C# chiedi pure qui

Luca

schumy2000 Profilo | Junior Member


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Innanzitutto grazie della risposta.
Avevo letto qualcosa a proposito del mutex ed ho trovato qualcosa in giro, però nei progetti per Pocket PC non esiste la proprietà ProcessName in c# rendendo così impossibile l'applicazione di tale metodo.

Non ce un altra maniera di realizzazione?

Grazie, Ciao.

-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

aiedail92 Profilo | Expert

Il codice che devi usare è quello dell'ultimo post, non serve Process.ProcessName. In C# corrisponde a questo:

[DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount); [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] private static extern int SetForegroundWindow(IntPtr handle); private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam); private void TuaForm_Load(object sender, EventArgs e) { //Prova ad aprire il mutex Mutex mut = null; try { mut = Mutex.OpenExisting("SINGIST"); } catch (Exception) { } //Se non è aperto significa che non esiste, quindi lo crea if (mut == null) { mut = new Mutex(true, "SINGIST"); } //altrimenti indica alla finestra che sta venendo chiusa e cerca //la finestra da portare in primo piano else { this.Text = this.Text + "_Closing"; EnumWindows(new EnumWindowProc(this.OpenInstance), IntPtr.Zero); } } private bool OpenInstance(IntPtr hwnd, IntPtr lParam) { //Se la finestra è la stessa corrente non è quella da portare in primo piano if (hwnd == this.Handle) { return true; } //Ottiene il nome della finestra elaborata StringBuilder sb = new StringBuilder(); GetWindowText(hwnd, sb, this.Text.Length); //Se la finestra ha come testo lo stesso di quella corrente //la porta in primo piano e chiude l'applicazione corrente if (sb.Length > 0 && this.Text.StartsWith(sb.ToString())) { SetForegroundWindow(hwnd); Process.GetCurrentProcess().Kill(); return false; } //Altrimenti cerca la finestra successiva else { return true; } }

Luca

schumy2000 Profilo | Junior Member

ciao Luca

ho applicato la soluzione che mi hai proposto però mi da alcuni errori che potrebbero essere riconducibili al fatto di essere sotto piattaforma Pocket PC e quindi non avere la piena potenza del .Net framework più in particolare
Mutex.OpenExisting("SINGIST") --- non esiste per lui questa funzione

Mutex mut=new Mutex(true, "SINGIST"); ----> Mutex ha 2 costruttori uno vuoto e l'altro che accetta come parametro un booleano.

Ti corrisponde la descrizione che ti ho fatto?

Grazie, Ciao.


-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein

aiedail92 Profilo | Expert

Ciao

Mi sono documentato un po' e sono giunto alla conclusione che i Mutex non possono essere la strada per fare ciò che ti serve, questo perchè su Pocket PC non è possible creare dei Mutex denominati che sono gli unici ad avere visibilità a livello di sistema, e quindi gli unici ad essere utili a più processi.

Ho pensato quindi a una soluzione alternativa, dovrebbe essere abbastanza "sicura":

La prima applicazione crea un file, alloca una certa quantità di memoria (ad esempio 4 byte) e scrive nel file l'indirizzo della memoria allocata. Questa memoria è condivisa fra tutti i processi, quindi quando viene chiamata la seconda applicazione per prima cosa controlla che il file esista. Se esiste significa che un'altra applicazione è in corso. A questo punto per verificare che sia effettivamente così (infatti il file potrebbe essere stato ricreato, oppure non essere stato cancellato per un arresto anomalo) legge l'indirizzo della memoria allocata dall'altra applicazione e ottiene il valore. Questo può assumere quindi in discreto numero di valori, ma solo uno indica che l'applicazione è ancora in corso. Confrontando il valore ottenuto con quello prestabilito l'applicazione si assicura che non ce ne siano già altre in esecuzione, se invece la memoria è corrotta provvede ad aggiornare il file e ad allocare della nuova memoria.

Spero di essere stato abbastanza chiaro, forse dal codice si capisce meglio:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Luca

schumy2000 Profilo | Junior Member

Ciao Luca
si in effetti l'unico modo è la soluzione che mi hai prospettato nel post precedente, anche se effettivamente speravo ci fosse qualche soluzione più "veloce" ovvero qualche proprietà che mi diceva se il processo era già in attività.
Cmq applicherò sicuramente questa soluzione.
Grazie, Ciao alla prox.
-------------------------------------------------------------------------------------------------------------
Talvolta un pensiero mi annebbia l'Io: sono pazzi gli altri o sono pazzo io?
A. Einstein
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5