Gambas-it

Gambas3 => Programmazione => Topic aperto da: vuott - 14 Marzo 2012, 01:09:49

Titolo: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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 !
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: fsurfing - 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
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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" !
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: fsurfing - 14 Marzo 2012, 19:47:52
ma io l' avevo scritto errato appositamente  :P

volevo vedere se eri attento!  :o
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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 (http://www.gambas-it.org/smf/index.php?topic=2055.msg22637#msg22637)  :devil:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 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
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 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

Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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" ?
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 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:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 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
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 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"] !
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 16 Marzo 2012, 16:11:57
...Perché non scrivi il codice  :-[ , dunque, e ci mostri questa tua soluzione ?  ;)

Mi pare che il codice l'abbiate già scritto; secondo me si tratta solamente di togliere la MessageBox. Non ho fatto ancora alcuna prova. Comunque per gli utilizzatori di Gnome3, lo soluzione è semplicissima, perchè non occorre intervenire  nel programma; basta infatti aggiungere il programma.gambas nel lanciatore di Gnome. Sarà lo stesso Gnome3 a puntare sull'applicativo già aperto, senza che si corra alcun rischio di moltiplicare all'infinito la  sessione attiva dello stesso programma. Comunque, non appena potrò  proverò anch'io.  :D
Ciao.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 16 Marzo 2012, 23:01:43
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. 

Scusa Golia, forse non ho capito, ma _scn/ctrapp può chiamarsi anche fantasia o no? Se no, chi è il suo proprietaro? Un'altra cosa: magari, mentra è attiva una versione del mioprogramma.gambas potrei avere la necessità di confrontare determinati effetti lanciando anche il mioprogramma dall'Ide di Gambas. Sono in grado di sapere dal settings o dalla shell se il mioprogramma già attivo è quello in formato eseguibile o no, oppure se sono entrambi attivi?
 :ciao:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 00:12:16
Citazione
Scusa Golia, forse non ho capito, ma _scn/ctrapp può chiamarsi anche fantasia o no?
Si, è solo un nome
Citazione
settings[Application.Name & "_scn/ctrapp"]
Può essere anche
Citazione
settings["pippoBaudo"]


Citazione
Sono in grado di sapere dal settings o dalla shell se il mioprogramma già attivo è quello in formato eseguibile o no, oppure se sono entrambi attivi
In questo sistema anche se apri da eseguibile o dall'ide di gambas il controllo che farà è lo stesso, è come se andasse a leggere in un database, o eseguibile o dall'ide legge sempre la stessa cosa, quindi leggerà 0 se non è mai stato aperto, e 1 se lo è stato..è solo un controllo con valori che sono io a dare all'apertura e alla chiusura. Non puoi vedere se sono entrambi attivi, almeno con questo sistema.
Ciao  :2birre:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 17 Marzo 2012, 15:50:36
@ Golia:
Premesso che io posseggo G2, ho constatato l'attivazione della proprietà settings, ho inserito il tuo codice in un programmino, ma non ha funzionato; infatti sin dal primo ed unico avvio del prgramma, ottengo la condizione di priogramma già attivo. Sembra che la if settings trovi la condizione 1 posta proprio dall'avvio corrente del programma. Se in g3 non è così, probabilmente è una limitazione in più per g2.
Ciao.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 17 Marzo 2012, 18:14:37
@ Golia:
Premesso che io posseggo G2, ho constatato l'attivazione della proprietà settings, ho inserito il tuo codice in un programmino, ma non ha funzionato; infatti sin dal primo ed unico avvio del prgramma, ottengo la condizione di priogramma già attivo. Sembra che la if settings trovi la condizione 1 posta proprio dall'avvio corrente del programma. Se in g3 non è così, probabilmente è una limitazione in più per g2.

Io ho Gambas-3, e confermo il risultato negativo descritto da Picavbg.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 17 Marzo 2012, 18:48:42
Ho provato quest'altra soluzione (però torniamo alla Shell !):

Codice: gambas [Seleziona]

Public Sub Form_Open()

 Dim risultato As String
 Dim iRis As Byte

  Shell "ps aux | grep " & "nome_programma.gambas" & " | grep -wv grep | wc -l" To risultato
  
  iRis = CByte(Trim(risultato))
  
  If iRis > 1 Then
    FMain.Close
  Endif
  
End


...e funziona.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 17 Marzo 2012, 19:28:39
@Golia
scusa ma la tua soluzione presenta un problemino...
quando la seconda istanza si chiude a seguito del controllo sul valore nel settings, automaticamente lo riporta a 0, questo comporta che una terza istanza si avvierà normalmente.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 19:36:53
up...
Questa funzione la uso nei miei programmi e ha sempre funzionato bene...che cavolo adesso non va più! :-\
appena ho un pò di tempo vedo che cavolo è successo..giuro, funzionava :-\ la logica è giusta
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 19:42:02
Citazione
quando la seconda istanza si chiude a seguito del controllo sul valore nel settings, automaticamente lo riporta a 0, questo comporta che una terza istanza si avvierà normalmente.
Questo è vero e non ci avevo mai pensato/provato :-[. resta il fatto che non capisco come possa superare il controllo alla seconda apertura
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 21:09:57
No, ci ho riprovato, funziona anche aprendo la terza istanza. la logica è giusta, è setting che secondo me non fa quello che pensavo dovrebbe fare.
Invece di usare setting ho provato a usare un file esterno, certo non è un buon metodo ma almeno ho potuto vedere che la mia logica era giusta.
Codice: gambas [Seleziona]

Private Sub scrivi(valore As String)
  Dim myfile As String
  Dim hfile As File
  myfile = User.Home & "/prova.txt"
    If myfile Then
      hFile = Open myfile For Create
      Print #hFile, valore
      Close #hFile    
    Endif
End

Private Sub leggi() As String
  Dim myfile As String
  Dim hfile As File
  Dim lettura As String
  
  myfile = User.Home & "/prova.txt"
If myfile Then
    hFile = Open myfile For Input
    Line Input #hFile, lettura
  Close #hFile
Endif  
Return lettura
End

Public Sub Form_Open()

If leggi() = "1" Then
      If Message.Warning("Il programma è già aperto", "forza apertura", "non aprire di nuovo") = 1 Then
      Else
      Me.Close
      Endif
Endif

scrivi("1")

End

Public Sub Form_Close()

scrivi("0")


End




@vuot
Citazione
Ho provato quest'altra soluzione (però torniamo alla Shell):
:ok:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 17 Marzo 2012, 21:13:46
Codice: gambas [Seleziona]
Private iRun As Integer

    Public Sub Form_Open() 
       iRun = settings[Application.Name & "_scn/ctrapp"]
       Inc iRun
     If iRun > 1 Then
       Me.Close
       Else
         settings[Application.Name & "_scn/ctrapp"] = iRun
         settings.Save
     Endif 
     
    End 
     
    Public Sub Form_Close() 
    Dec iRun
    settings[Application.Name & "_scn/ctrapp"] = iRun 
    End 
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 17 Marzo 2012, 21:36:35
Codice: gambas [Seleziona]
Private iRun As Integer

    Public Sub Form_Open() 
       iRun = settings[Application.Name & "_scn/ctrapp"]
       Inc iRun
     If iRun > 1 Then
       Me.Close
     ......etc


Sì, ora funziona !  Mago Sotema !
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 21:47:46
 :ok:
grazie, il puzzle che mancava
Citazione
        settings.Save
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 17 Marzo 2012, 21:50:52
No, ci ho riprovato, funziona anche aprendo la terza istanza. la logica è giusta, è setting che secondo me non fa quello che pensavo dovrebbe fare.
Invece di usare setting ho provato a usare un file esterno,

Sì, Golia, funziona.
Però (lo dico per gli utenti meno esperti come me), visto il tuo codice, il file bisogna crearlo "a mano" prima di avviare il programma, se no dà errore.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 17 Marzo 2012, 22:11:59
quella del file esterno è solo una prova, con la soluzione di sotema adesso funziona di nuovo anche la mia prima soluzione, basta aggiungere settings.save

edit:
Citazione
il file bisogna crearlo "a mano"
non dovrebbe
     hFile = Open myfile For Create 
a me lo ha creato da solo :rolleyes:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 18 Marzo 2012, 00:19:18
non dovrebbe
     hFile = Open myfile For Create  
a me lo ha creato da solo :rolleyes:


A me dà errore "File or directory doesn't exist" sulla riga: hFile = Open myfile For Input !
Del resto suppongo che, quando legge il condizionale:
Codice: [Seleziona]
Public Sub Form_Open()  
    If leggi() = "1" Then
   ....
venga chiamata la funzione leggi(), la quale tenta di leggere da un file non ancora creato.

Non ottengo errori, se lo creo prima a parte nella directory prevista dal codice.  :-\
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 18 Marzo 2012, 00:47:03
Mi dispiace darvi la notizia che a me la soluzione di sotema non funziona. Anche l'idea di scrivere in un file.txt un contatore non è, secondo me, elegante. Io sto cercando di verificare in un colpo solo l'esistenza del mioprogramma.gambas e la contemporanea non esistenza del file mioprogramma -- (cioè quello avviato dall'ide di gambas). Sono arrivato a questa idea dal seguente riscontro:
Avvio programma in prova "TestDbContabFam.gambas"
avvio comando shell:
Codice: [Seleziona]
 $ ps -ax
------- bla -------bla -------
4281 ?        S      0:00 gbr2 /home/piero/mnt/dativari/Gambas2-23/Gambas_Progetti/TestDbContabFam/TestDbContabFam.gambas
Avvio stesso programma dall'Ide di Gambas e successivamente ripeto la shell:
Codice: [Seleziona]
  $ ps -ax
------- bla -------bla -------
 4281 ?        S      0:00 gbr2 /home/piero/mnt/dativari/Gambas2-23/Gambas_Progetti/TestDbContabFam/TestDbContabFam.gambas
 4291 ?        S      0:00 /usr/bin/gbx2 -g -f /home/piero/mnt/dativari/Gambas2-23/Gambas_Progetti/TestDbContabFam --
per eseguire il controllo sulla sola presenza dell'eseguibile, ho modificato la shell di partenza nella sequenza:

Codice: [Seleziona]
DIM bRisult AS Boolean
DIM Esito AS String
SHELL "pgrep -fl TestDbContabFam.gambas" WAIT TO Esito
bRisult = Esito LIKE "*TestDbContabFam.gambas*"
IF bRisult
  Message.Warning("Trovato: " & Esito)
  QUIT
ENDIF
Come però detto precedentemente al primo avvio dell'eseguibile la stringa TestDbContabFam.gambas viene fornita già come preesistente e quindi la struttura creata non funziona.
Ciao.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 18 Marzo 2012, 00:52:08
Potresti provare questa e dirmi se funzica?
Codice: gambas [Seleziona]

    Public Sub Form_Open()  
      
     If settings[Application.Name & "_scn/ctrap"] = "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/ctrap"] = "1"  
      settings.Save
    End  
      
    Public Sub Form_Close()  
    settings[Application.Name & "_scn/ctrap"] = "0"  
    settings.Save
    End  

Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 18 Marzo 2012, 00:56:51
Potresti provare questa e dirmi se funzica?
.........

A me funziona.
Preciso che uso Gambas-3.
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 18 Marzo 2012, 01:07:23
ok
per il file non so che dirti.. ???
 myfile = User.Home & "/prova.txt"  cosa ti ritorna?
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 18 Marzo 2012, 01:10:51
myfile = User.Home & "/prova.txt"  cosa ti ritorna?

Va bene.

La cosa che  non capisco è che se creo il file prova.txt da codice all'apertura del programma, non funziona ugualmente: mi funziona il tuo applicativo solo se creo il file a parte !  :-\
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 18 Marzo 2012, 01:18:27
 :-\
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 18 Marzo 2012, 10:46:56
Citazione
Mi dispiace darvi la notizia che a me la soluzione di sotema non funziona.
...nel codice postato mancavano un paio di linee, di seguito il codice corretto da inserire nel file FMain.class

Codice: gambas [Seleziona]
Private iRun As Integer  
Private hsettings As Settings


Public Sub Form_Open()   
  hsettings = New Settings(User.Home &/ "prova.conf")
   iRun = hsettings[Application.Name & "_scn/ctrapp", 0] 
   Inc iRun 
 If iRun > 1 Then 
   Me.Close 
   Else 
     hsettings[Application.Name & "_scn/ctrapp"] = iRun 
     hsettings.Save 
 Endif   
End

Public Sub Form_Close()   
  Dec iRun 
  hsettings[Application.Name & "_scn/ctrapp"] = iRun   
  hsettings.Save
End   


da IDE crea un eseguibile e lancialo + volte...
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 18 Marzo 2012, 11:34:48
Penso prorpio di avere risolto, senza impegnare alcun file .txt e senza utilizzare la Form_CLose:
Codice: gambas [Seleziona]
PUBLIC SUB Form_Open()
DIM iPuntIni AS Integer
DIM iPuntFin AS Integer
DIM iLunStriMia AS Integer
DIM iLun2 AS Integer

DIM Esito AS String
DIM $StriMia AS String = "TestDbContabFam.gambas"

  iLunStriMia = Len($StriMia)
  SHELL "pgrep -fl " & $StriMia WAIT TO Esito
  iPuntIni = InStr(Esito, $StriMia)
  iPuntFin = RInStr(Esito, $StriMia) + iLunStriMia
  iLun2 = iPuntFin - iPuntIni
  IF iLun2 > iLunStriMia THEN
      QUIT
  ENDIF
END


La Sghell restituisce una stringa formata da tutte le ricorrenze contenenti  TestDbContabFam.gambas, per cui agendo sulla lunghezza della sottostringa formata dal punto di inizio della prima ricorrenza e dal punto di fine dell'ultima ricorrenza, si intuisce il numero delle chiamate al programma eseguibile e ne viene permessa solamente una, però se la 2^ chiamata viene fatta dall'ide di Gambas, allora la ricorrenza con estensione ".gambas" viene incontrata una volta sola ed il programma si avvia ugualmente.  ;)  ;D  ;D
Provare per credere.
 :ciao: :ciao:

Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 18 Marzo 2012, 11:59:16
@ sotema:
Ho letto la tua ultima risposta dopo avere completato la mia prova, per cui l'ho potuta provare solo ora.  :D Va bene, ora funziona anche a me, discorda con la mia solo per una condizione; ho provtao a lanciare il programma dall'ide di Gambas, dopo avere avviato l'eseguibile, ed il programma, esistendo già una sua copia (la .gambas) in esecuzione, non si avvia. Riconosco che la mia idea di far partire il programma dall'ide di Gambas, pur avendolo già avviato dall'eseguibile è una necessità più che rara, tuttavia logicamente possibile. Le due soluzioni sono entrambe funzionali e funzionanti, dipende dal risultato pratico che si voglia ottenere, quindi  :2birre:  :2birre: per tutti.
 :ciao:  :ciao:  :ciao:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 18 Marzo 2012, 12:08:10
non esiste mai una sola strada...
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Golia - 18 Marzo 2012, 13:07:43
Citazione
quindi   :2birre: :2birre:  per tutti

Citazione
non esiste mai una sola strada...

ben detto :D  :2birre:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 18 Marzo 2012, 18:42:27
l'unione fa la forza:
così dovrebbe funzionare anche in caso che una precedente istanza del programma sia abortita a seguito di errore.

Codice: gambas [Seleziona]
Private hSetting As Settings


Public Sub _new()

End

Public Sub Form_Open()
Dim iPid As Integer = Application.Id
Dim sPid, sSysPid As String
hSetting = New Settings(User.Home &/ "myapp.conf")
  If (hSetting["Application/pid", 0] = 0) Then
    ' questa è la prima  esecuzione
    hSetting["Application/pid"] = iPid
    hSetting.Save
    Else
      sPid = hSetting["Application/pid"]
      Shell "ps aux | grep " & sPid & "  | grep -wv grep | wc -l" Wait To sSysPid
      sSysPid = Replace(sSysPid, "\n", "")
      If (Val(sSysPid) > 0) Then
        Me.Close ' Applicazione già attiva
        Else
          ' istanza precedente probabilmente abortita
          hSetting["Application/pid"] = iPid
          hSetting.Save
      Endif
  Endif
End

Public Sub Form_Close()
 
End
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 18 Marzo 2012, 19:59:07
 :D
Avete visto ?
Io avevo dato semplicemente un LA, ed avete visto quanto è stato pensato, provato e scritto ?  :coder:
...e quante soluzioni al medesimo problema ! «non esiste mai una sola strada... » (sotema)


Potremmo proporre una pagina ad hoc, nella quale - posta già una soluzione ad un problema - si possa avviare un utile e proficuo dibattito identico a quello qui sopra avvenuto per cercare altre possibili - e magari più brevi e veloci - soluzioni. Questa pagina speciale potrebbe chiamarsi...: "Spremi le meningi".  :rotfl:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: sotema - 18 Marzo 2012, 20:07:20
Citazione
Io avevo dato semplicemente un LA
senza un riferimento musicale non ce la FAi prorpio!!!

ok per "spremi le meningi"
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: Picavbg - 19 Marzo 2012, 00:30:20
Attenti, ...  che vi viene il mal di testa.  :rotfl:
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: md9327 - 19 Marzo 2012, 12:14:46
Beato te, a me mi viene da vomitare...  ;D
Titolo: Re: Impedire l'avvio di un programma.gambas già avviato
Inserito da: vuott - 07 Novembre 2012, 15:41:41
Nella M.L.I. è stato nuovamente sollevato questo problema, ne riporto una risposta:

" You can use a .Lock file.

if this file exist for example in ~/.cache/myapp dir then say to the user
that the app is already running ... destroy this file when quitting the app

if the app crash before so the file still exist.. just say to the user if
he is sure to not have launched another time...

Fabien Bodard
"