Autore Topic: Impedire l'avvio di un programma.gambas già avviato  (Letto 4037 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Impedire l'avvio di un programma.gambas già avviato
« il: 14 Marzo 2012, 01:09:49 »
[Poiché penso che questo forum non debba contenere soltanto richieste di aiuto, ma che possa anche ospitare soluzioni non richieste,] vorrei portare a conoscenza e, quindi, a beneficio  :coder: di tutti gli utenti del forum, la soluzione data all'argomento in oggetto da un utente, Jussi Lahtinen, della mailing-list internazionale di Gambas:

Codice: gambas [Seleziona]
Public Sub Form_Open()
 
  Dim sOutput As String

  Exec ["pgrep", "-f", "-l", "NameOfYourProgram.gambas"] Wait To sOutput

  If Split(Trim$(sOutput), gb.NewLine).Count > 1 Then
    Quit
  Endif

End


Insomma, può impedire, per esempio, che cliccando per errore più volte partano contemporaneamente due o più processi del medesimo programma.


Se magari avete anche voi delle soluzioni da aggiungere....  :coder:
« Ultima modifica: 19 Marzo 2012, 18:59:20 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #1 il: 14 Marzo 2012, 01:54:52 »
Io, per esempio, avevo ipotizzato una possibile soluzione (che a me funziona) con comandi diversi, ma che rispetto alla soluzione di Lahtinen è più lunga, contorta e complessa  :danger: .
La riporto  :-[ solo per mera curiosità:

Codice: gambas [Seleziona]

Public Sub Form_Open()

 Dim index As String
 Dim plura As String[]
 Dim a, b As Integer

' Otteniamo il PID dei processi (programmi) aperti, aventi il medesimo "nome_programma.gambas":
   Shell "ps -aux | grep " & "nome_programma.gambas" To index
 
   plura = Split(index, " ")

   For a = 0 To plura.Max

' Cerca il riferimento al 1° programma aperto (cioè a quello con identico nome al proprio):
     If Right(plura[a], 20) Like "*.gambas*" Then

' Così può passare a "Kill" la stringa, contenuta da ciascuna variabile "plura"
' "successiva" alle stringhe che si riferiscono al 1° processo (che resta così protetto),
' sino a quando non passerà la stringa contenente il PID del 2° processo
' (se è stato aperto il 2° programma), cioè... se stesso !
       For b = a To plura.Max

' Non appena viene passato il PID del 2° processo, questo viene terminato.
' Quindi il programma (se è il 2°) si auto-elimina e non si apre:
         Try Shell "kill " & plura[b]
       Next

     Endif

   Next

End


...una sorta di trattore tagliaerba !
....e amen !
« Ultima modifica: 19 Marzo 2012, 18:59:34 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #2 il: 14 Marzo 2012, 13:45:24 »
io invece direi che è assolutamente inutile scomodare shell quando si pu avere:

Codice: [Seleziona]
public sub form_open
DIM P AS NEW Pointer[]  

P = Desktop.find(Application.Name)  
  
IF p.count = 1 THEN  
  
message.info("applicazione non ancora avviata")  
ELSE IF p.count > 1 THEN  
message.info("applicazione già avviata")  
fmain.close

 END IF


 :P
« Ultima modifica: 14 Marzo 2012, 13:47:58 da fsurfing »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #3 il: 14 Marzo 2012, 16:23:29 »
io invece direi che
:ciao:
La tua soluzione in sé è mooolto interessante !

Mi permetto solo di segnalare agli utenti:
- che è necessario attivare il componente gb.desktop;
- che per gli utenti di Gambas-3 il metodo di Desktop sarà: "FindWindow" (e non più .Find).

Volevo dirti, fsurfing, che ho provato questa soluzione, ma mi si apre il programma due volte ! :-X
« Ultima modifica: 15 Marzo 2012, 00:52:35 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #4 il: 14 Marzo 2012, 18:58:30 »
Volevo dirti, fsurfing, che ho provato questa soluzione, ma mi si apre il programma due volte ! :-X

Allora... poiché non era possibile  (♫...sviolinata ;D ) che il tuo suggerimento non funzionasse (mi si apriva due volte), mi ci sono applicato . L'ho aggiustato semplicemente così :
Codice: gambas [Seleziona]

Public Sub Form_Open()

 Dim P As New Pointer[]

  P = Desktop.FindWindow(Application.Name)

  If P.count = 0 Then  
    message.info("applicazione non ancora avviata")  
  Else If P.count > 0 Then  
    message.info("applicazione già avviata !")  
    FMain.Close
  End If
  
 End

...ora a me funziona.

Comunque, fsurfing, ottimo suggerimento il tuo: hai eliminato l'uso di "Shell" !
« Ultima modifica: 19 Marzo 2012, 18:59:57 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #5 il: 14 Marzo 2012, 19:47:52 »
ma io l' avevo scritto errato appositamente  :P

volevo vedere se eri attento!  :o

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #6 il: 15 Marzo 2012, 00:36:34 »
ma io l' avevo scritto errato appositamente  :P
volevo vedere se eri attento!  :o

.....mi ricorda vagamente qualcosa 
http://www.gambas-it.org/smf/index.php?topic=2055.msg22637#msg22637  :devil:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #7 il: 15 Marzo 2012, 09:41:37 »
A me si apre ancora 2 volte  :hatecomputer:
alla prima apertura P.count resta a 0, alla seconda P.count = 2, quindi il messaggio si apre alla terza apertura e non alla seconda.
Ho abilitato le Qt, non capisco perchè salta direttamente P.count = 1

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #8 il: 15 Marzo 2012, 14:10:55 »
A me si apre ancora 2 volte  :hatecomputer:
Ciao Golia,
sì, ho rifatto delle prove, hai ragione, qualche volta fa i capricci  :-\ , ma il più delle volte funziona.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #9 il: 15 Marzo 2012, 14:58:42 »
 :-\
La più sicura resta questa:
Codice: gambas [Seleziona]

Public Sub Form_Open()
 
  If settings[Application.Name & "_scn/ctrapp"] = "1" Then
       If Message.Warning("Il programma è già aperto", "forza apertura", "non aprire di nuovo") = 1 Then

          Else
          Me.Close
       Endif
  Endif
 settings[Application.Name & "_scn/ctrapp"] = "1"

End

Public Sub Form_Close()
 settings[Application.Name & "_scn/ctrapp"] = "0"
End


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #10 il: 15 Marzo 2012, 18:07:09 »
La più sicura resta questa:
....
Per gli utenti come me meno esperti, comunico che, per provare la soluzione proposta da Golia, è necessario attivare il componente "gb.settings".

Ad ogni modo, Golia, ho provato la tua interessante soluzione, ma... non funziona a me.  :-\

Ti volevo chiedere per capire meglio: potresti commentare la linea settings[Application.Name & "_scn/ctrapp"] = "1" ?
« Ultima modifica: 15 Marzo 2012, 18:12:19 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #11 il: 16 Marzo 2012, 01:06:08 »
Scusate la mia intromissione, ma piuttosto che avvisare del programma già apero con Message.Warning, io punterei alla finestra  già attiva del programma, proprio come si comporta Gnome3 (di Fedora), eseguendo direttamente il setting.  ;)
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #12 il: 16 Marzo 2012, 01:10:59 »
Scusate la mia intromissione,
 :ciao:

:ciao:
E' proprio quello che vogliamo, Picavbg !  :coder:


...io punterei alla finestra  già attiva del programma, proprio come si comporta Gnome3 (di Fedora), eseguendo direttamente il setting.  ;)
...Perché non scrivi il codice  :-[ , dunque, e ci mostri questa tua soluzione ?  ;)
 :ciao:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #13 il: 16 Marzo 2012, 10:03:49 »
Citazione
settings[Application.Name & "_scn/ctrapp"] = "1"
settings[Application.Name & "_scn/ctrapp"] è solo un "contenitore", quindi quando apro il programma e supera il controllo che il contenitore non abbia il valore "1", imposto il valore "1" al contenitore in modo che se dovessi aprirlo un'altra volta (doppione) il controllo trova il valore 1, quindi si ferma. Quando chiudo il programma
Citazione
Form_Close() 
settings[Application.Name & "_scn/ctrapp"] = "0" 
End 
riporto il valore a 0

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #14 il: 16 Marzo 2012, 14:43:12 »
Sì... il procedimento logico delle due routine era chiaro ed evidente; io mi riferivo all'istruzione in sé: settings[Application.Name & "_scn/ctrapp"] !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »