Visual Basic Simple
Rilevare se una precedente istanza del programma è attiva
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Difficoltà: 1 / 5

Può essere interessante ed utile impedire che un nostro programma venga caricato due volte contemporaneamente. La sua utilità si dimostra nel momento in cui l'attivazione di una prima istanza del programma provoca un blocco di determinate risorse, quale l'ascolto su una porta seriale o la connessione Internet su una particolare porta TCP/IP oppure la riproduzione audio della scheda audio, in quanto tali risorse, per loro natura, non possono interagire su due processi contemporaneamente.

Vedremo come rilevare se un nostro programma viene caricato più di una volta. In tal caso la seconda istanza del programma verrà chiusa e verrà mostrata la finestra della prima istanza.

Il nostro progetto si comporrà di due semplici Labelposte sopra un form. Il programma non farà null'altro che mostrare l'orario nel quale la prima istanza è stata caricata e chiudere la seconda istanza quando verrà richiamata.

Figura 1Inseriamo sopra il nostro form due Label: la prima si chiamerà Label1 e conterrà il testo "Il programma è stato eseguito il: ", mentre la seconda avrà il nome di Label2 e conterrà il testo "Data e ora".

Il codice si riassume in pochissime righe inserite nell'eventoLoad del form.

  1. Option Explicit
  2. Private Sub Form_Load()
  3.     Dim CaptionForm As String
  4.     If App.PrevInstance Then
  5.         MsgBox "C'è già una istanza di questo programma", vbExclamation, "Rileva istanza attiva"
  6.         CaptionForm = Me.Caption
  7.         Me.Caption = ""
  8.         Unload Me
  9.         AppActivate CaptionForm
  10.     Else
  11.         Label2.Caption = Now
  12.     End If
  13. End Sub

Alla riga 4 abbiamo dichiarato una variabile di nome CaptionForm di tipo stringa. Essa sarà utilizzata per salvare la Caption del form, poiché verrà modificata alla riga 8.

Il cuore di questa funzione si trova alla riga 5.
Viene controllato, tramite la proprietà App.PrevInstance se sono presenti altre istanze del programma. In caso negativo verrà eseguita la riga 12, che aggiorna il contenuto della Label2 con l'orario corrente.

Se è presente almeno un'altra istanza del programma, viene mostrata una finestra che avverte di questo (riga 6), la Caption del form viene prima salvata nella variabile CaptionForm (riga 7) e poi viene azzerata alla riga 8.

Poiché abbiamo tentato di aprire due copie dello stesso programma, quella che sta caricando (ovvero la seconda) viene subito chiusa tramite l'istruzione Unload della riga 9. Questo farà sì che alla fine della routine Form_Load venga chiuso il programma.
Prima di chiudere, però, viene attivata (ovvero mostrata) la finestra dell'altra istanza, tramite l'istruzione AppActivate. Questa richiede il titolo della finestra da attivare.

Alla riga 7 è stata salvata la Caption della finestra. Basterà per cui attivare la finestra la cui Caption è uguale a quella contenuta nella variabile CaptionForm. Per questo motivo è estremamente importante evitare di cambiare la Caption del form in questo genere di operazioni. Infatti, se la Caption venisse cambiata, l'istruzione AppActivate, non trovando la finestra da mostrare genererebbe un errore.

Magari vi starete chiedendo come mai abbiamo cambiato la Caption del form alla riga 8? La spiegazione è molto semplice: se la seconda istanza porta la stessa Caption della prima, è impossibile far capire all'istruzione AppActivate che vogliamo attivare l'altra istanza del programma, poiché AppActivate lavora in base alla Caption della finestra principale. Abbiamo, per cui, preferito azzerare la Caption dell'istanza che deve essere chiusa prima di attivare l'altra.

Ciò fa in modo che la chiamata AppActivate tenti di attivare la finestra la cui Caption sia identica a quella salvata. La seconda istanza non porterà più quel titolo. Per cui rimane soltanto una possibile finestra da attivare e quella sarà attivata.

Per provare questo programma è necessario compilare il programma in un file eseguibile, poiché la proprietà App.PrevInstance non funziona all'interno dell'IDE di Visual Basic.

Figura 2Effettuata la compilazione eseguite una prima volta il programma e verrà mostrato il form, con l'orario di esecuzione.

Figura 3Nel momento in cui verrà tentata l'apertura di una seconda istanza del programma verrà mostrata una finestra che avverte di questa situazione. Appena l'utente clicca il pulsante OK la seconda istanza del programma verrà chiusa e verrà nuovamente mostrata la prima copia del programma.

Questo genere di operazioni, comporta pochissimi rischi: il principale riguarda l'impossibilità di cambiare in fase di esecuzione la Caption del form.

Giuseppe Della Bianca
9 Gennaio 2001

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'indice degli HowTo