Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
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. Inseriamo 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.
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. 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. 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. Effettuata la compilazione eseguite una prima volta il programma e verrà mostrato il form, con l'orario di esecuzione. Nel
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
|
Torna all'indice degli HowTo |