Gambas-it

Gambas3 => Programmazione => Topic aperto da: dex - 02 Aprile 2019, 19:14:52

Titolo: [Risolto] Programma che avvia altro Programma
Inserito da: dex - 02 Aprile 2019, 19:14:52
Ciao raga
devo fare una cosa del genere, 2 programmi gambas A e B
A è semplice, composto da un timer che ogni tanto deve controllare se B è in esecuzione, se non è in esecuzione lo avvia.
l'unica cosa che non so come fare in A il controllo se B è in esecuzione.
Mi date qualche dritta come risolvere
Titolo: Re:Programma che avvia altro Programma
Inserito da: Gianluigi - 02 Aprile 2019, 19:52:33
Potresti dare un'occhiata a questa lezione:
https://www.gambas-it.org/wiki/index.php?title=Inviare_dati_da_un_programma_Gambas_ad_un_altro_mediante_le_risorse_del_Componente_DBus

Poi ci sarebbe anche gb.net ma non ci ho ancora capito molto, c'è appena stata una discussione sulla ML...
Titolo: Re:Programma che avvia altro Programma
Inserito da: vuott - 02 Aprile 2019, 23:25:45
Potrebbe interessarti, forse, anche questa pagina:

https://www.gambas-it.org/wiki/index.php?title=Sapere_se_un_programma_esterno_%C3%A8_gi%C3%A0_in_funzione
Titolo: Re:Programma che avvia altro Programma
Inserito da: Gianluigi - 03 Aprile 2019, 13:44:28
Si ha ragione vuott, ho recuperato dalla wiki e da passate discussioni del codice da lui postato e ho messo insieme questo esempio.
Per fare una prova di questo codice occorre creare nella nostra cartella (directory) home una nuova cartella e nominarla ProgrammaConControllo.
Avviamo l'IDE di Gambas e creiamo un semplice programma grafico (non importa dove lo salviamo) che nomineremo ProgB in cui ci limiteremo a scrivere B nella Proprietà Text di FMain.form.
Quindi da Progetto > Crea > Eseguibile... navighiamo fino alla cartella appena creata (ProgrammaConControllo) e salviamo l'eseguibile al suo interno.
Sempre dalla IDE creiamo un nuovo programma grafico che nomineremo ProgA dove in FMain.class copieremo il seguente codice.
Codice: [Seleziona]
Public Sub Form_Open()

  Dim iID As New Integer[]
  Dim sPath As String = User.Home &/ "ProgrammaConControllo"

  If Exist(sPath) Then
    Message.Info("#La directory esiste")
    iID = Desktop.FindWindow("B")
    sPath &= "/ProgB.gambas"
    If iID.count = 0 Then
      Try Exec [sPath] Wait
      If Error Then Message.Info("#L'applicazione non esiste!")
    Else If iID.count > 0 Then
      Message.Info("#L'applicazione è già avviata!")
    End If
  Endif
  Message.Info("#Mi sto chiudendo")
  Me.Close

End
Come per il programma B creiamo l'eseguibile salvandolo in ProgrammaConControllo.
Fatto.
Chiudiamo l'ide e dalla cartella ProgrammaConControllo avviamo il programma A (ProgA) per verificarne il funzionamento.

P.S. Molto probabilmente il New in Dim iID è superfluo...
Titolo: Re:Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 20:40:21
Gian
ho letto anche il link di vuot e mi porta a un codice dove basta individuare il Pid

che differenza c'è con quello che hai postato tu?
Titolo: Re:Programma che avvia altro Programma
Inserito da: naderit - 03 Aprile 2019, 21:48:03
ciao. non so se è una stupidaggine ma se il programma B va a leggere o scrivere in un file di testo di una determinata cartella e il programma A verifica l'accesso al quel determinato file, può essere una soluzione?  :ciao:
Titolo: Re:Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 22:07:18
ciao. non so se è una stupidaggine ma se il programma B va a leggere o scrivere in un file di testo di una determinata cartella e il programma A verifica l'accesso al quel determinato file, può essere una soluzione?  :ciao:

può essere una soluzione ma non sempre funziona.
Programma B si avvia e scrive 1 nel file, si chiude e scrive 0, tutto ok
Programma B va in tilt e Crash, nel file resta 1
Titolo: Re:Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 22:31:45
Gian
ho provato il tuo codice mi da
Codice: [Seleziona]
Simbolo Sconosciuto FindWindow nella classe Desktop


poi ho provato il codice postato da vuott, il codice funziona solo che non controlla se è in esecuzione e mi avvia molte istanze

Codice: [Seleziona]
Private hp As Process
Private pid As Integer

Public Sub Button1_Click()

 hp = Shell "nome_programma"

' Individuiamo il numero del PID, che sarà uguale al valore di .Id + 1 :   [Nota 3]
   pid = hp.Id + 1

   Print pid

End
Titolo: Re:Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 22:44:27
Scusa Gian
errore mio mi ero dimenticato di attivare Gb.Desktop

il tuo codice funziona
metto risolto
Titolo: Re:Programma che avvia altro Programma
Inserito da: vuott - 03 Aprile 2019, 22:50:52

poi ho provato il codice postato da vuott, il codice funziona solo che non controlla se è in esecuzione

Lega quel codice a questa soluzione:

https://www.gambas-it.org/wiki/index.php?title=Elencare_il_PID_ed_il_corrispondente_nome_di_ciascun_processo_attivo
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 22:51:54
Ho risposto troppo presto

finche il codice era in Open funzionava,attivando A partiva B, chiudendo A si Chiudeva B

ora che ho spostato il codice nel timer,  A mi avvia una nuova istanza di B ad ogni ciclo del Timer
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: vuott - 03 Aprile 2019, 22:54:35
...e... quindi ?   
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 23:01:53
Vuott mi riferivo al codice di Gianluigi

quello che hai postato tu mi trova tutti i pid attivi, ma come faccio a sapere il pid della mia applicazione B?
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: vuott - 03 Aprile 2019, 23:05:56
Con il primo codice che tu hai scelto dalla wiki lanci il programma esterno e ne conosci il PID.

Con il secondo puoi verificare se quel PID è presente fra quelli ritornati.

Devi insomma sapientemente combinare i due codici.
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: dex - 03 Aprile 2019, 23:08:37
Con il primo codice che tu hai scelto dalla wiki lanci il programma esterno e ne conosci il PID.

Con il secondo puoi verificare se quel PID è presente fra quelli ritornati.

Devi insomma sapientemente combinare i due codici.

Buona idea, avvio memorizzo il pid e con il timer controllo se quel pid è attivo
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: vuott - 03 Aprile 2019, 23:09:16
Ad ogni buon fine possiamo dire che il PID (Process IDentifier) è il numero non replicabile che identifica, dunque in maniera univoca, un processo all’interno di un sistema.

https://it.wikipedia.org/wiki/PID_(Unix)
https://en.wikipedia.org/wiki/Process_identifier
https://it.wikipedia.org/wiki/Processo_(informatica)#Strutture_dati_relative_a_processi_e_thread
https://stackoverflow.com/questions/49791861/what-is-a-process-identifier
Titolo: Re:[Risolto] Programma che avvia altro Programma
Inserito da: dex - 04 Aprile 2019, 00:26:29
Re Risolto
Grazie dell'aiuto