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

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 #30 il: 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.  :-\
« Ultima modifica: 18 Marzo 2012, 01:01:50 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 #31 il: 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.
:ciao:

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 #32 il: 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  

« Ultima modifica: 18 Marzo 2012, 00:54:31 da Golia »

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 #33 il: 18 Marzo 2012, 00:56:51 »
Potresti provare questa e dirmi se funzica?
.........

A me funziona.
Preciso che uso Gambas-3.
« Ultima modifica: 18 Marzo 2012, 00:58:23 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 Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #34 il: 18 Marzo 2012, 01:07:23 »
ok
per il file non so che dirti.. ???
 myfile = User.Home & "/prova.txt"  cosa ti ritorna?

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 #35 il: 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:-\
« Ultima modifica: 18 Marzo 2012, 01:14:46 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 Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #36 il: 18 Marzo 2012, 01:18:27 »
 :-\

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #37 il: 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...
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #38 il: 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:

:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #39 il: 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:
:ciao:

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #40 il: 18 Marzo 2012, 12:08:10 »
non esiste mai una sola strada...
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

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 #41 il: 18 Marzo 2012, 13:07:43 »
Citazione
quindi   :2birre: :2birre:  per tutti

Citazione
non esiste mai una sola strada...

ben detto :D  :2birre:

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #42 il: 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
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

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 #43 il: 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:
« Ultima modifica: 19 Marzo 2012, 00:13:07 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 sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Impedire l'avvio di un programma.gambas già avviato
« Risposta #44 il: 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"
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein