Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: madnessmike - 11 Febbraio 2009, 18:39:12

Titolo: IF/ELSE e processi
Inserito da: madnessmike - 11 Febbraio 2009, 18:39:12
Avrei bisogno di un (altro) piccolo aiuto.

In un programma che sto ottimizzando, sono intenzionato ad aggiungere una funzione che esegua una determinata operazione solo se un processo di nome X è in esecuzione. Si può fare?
Titolo: Re: IF/ELSE e processi
Inserito da: leo72 - 12 Febbraio 2009, 07:02:21
Un qualunque processo del sistema?
Io utilizzo questo codice che, premetto, NON è mio ma ho copia-e-incollato (mi pare) dalla mailing-list ufficiale:
Codice: [Seleziona]

PRIVATE FUNCTION Controllo() AS Boolean
DIM Esito AS String

  SHELL "ps aux | grep " & [i]nome_processo[/i] & " | grep -wv grep | wc -l" TO Esito
  RETURN IIf(Val(Risposta) > 1, TRUE, FALSE)
         
END

Se trova il processo il cui nome è nome_processo restituisce True, altrimenti restituisce False.

P.S.:
io lo uso con Application.Name & ".gambas" al posto di nome_processo per verificare che il mio programma non sia già lanciato.
Titolo: Re: IF/ELSE e processi
Inserito da: - 12 Febbraio 2009, 10:20:14
Agganciandomi al post di leo : secondo voi è possibile,  nel caso in cui trovi la mia applicazione gambas già in esecuzione, lanciargli un comando tipo "applicazione.gambas -opzione" con application.args[] ?? come se fosse un demone ??
Titolo: Re: IF/ELSE e processi
Inserito da: madnessmike - 12 Febbraio 2009, 14:47:47
Bello quel codice, Leo, ma sembra un po' troppo incasinato sul comando shell. Io lo ho rivisto in questo modo, ricorrendo a pgrep, che è anche più semplice da usare:

Codice: [Seleziona]
PUBLIC FUNCTION ProcessoAttivo() AS Boolean
  DIM Esito AS String
  SHELL "pgrep ecomorph" TO Esito
  IF Esito = NULL
    RETURN FALSE
  ELSE
    RETURN TRUE
  ENDIF
END


Quando un processo non esiste (nel mio caso ecomorph), pgrep non fornisce alcun output provocando un false all'uscita della funzione.
Titolo: Re: IF/ELSE e processi
Inserito da: leo72 - 12 Febbraio 2009, 15:11:17
Esistevano diverse soluzioni postate sulla mailing-list. Quella che ho pubblicato io però funziona sempre e restitusce correttamente se è già presente in memoria un altro processo che si chiama come quello che esegue il test.
Con pgrep mi pare invece che non possa sapere questa informazione perché ottengo solo che gbr2 o gbx2 è in esecuzione, ma non il sorgente Gambas in esecuzione, o sbaglio?
Titolo: Re: IF/ELSE e processi
Inserito da: madnessmike - 12 Febbraio 2009, 16:11:33
Sì, mi sono accorto che con i programmi gambas pgrep non funziona, ma nel mio caso, la mia procedura basta e avanza. ;-)
Titolo: Re: IF/ELSE e processi
Inserito da: giulio - 12 Febbraio 2009, 18:09:42
Ciao.

Per completare le informazioni, per ottenere il pid dei programmi gambas, pgrep
necessita dell'opzione -f.
Titolo: Re: IF/ELSE e processi
Inserito da: Ceskho - 14 Febbraio 2009, 19:08:30
Citazione

leo72 ha scritto:
Un qualunque processo del sistema?
Io utilizzo questo codice che, premetto, NON è mio ma ho copia-e-incollato (mi pare) dalla mailing-list ufficiale:
Codice: [Seleziona]

PRIVATE FUNCTION Controllo() AS Boolean
DIM Esito AS String

  SHELL "ps aux | grep " & [i]nome_processo[/i] & " | grep -wv grep | wc -l" TO Esito
  RETURN IIf(Val(Risposta) > 1, TRUE, FALSE)
         
END

Se trova il processo il cui nome è nome_processo restituisce True, altrimenti restituisce False.

P.S.:
io lo uso con Application.Name & ".gambas" al posto di nome_processo per verificare che il mio programma non sia già lanciato.


cosa va inseriro al posto di risposta tra parentesi?
Titolo: Re: IF/ELSE e processi
Inserito da: - 14 Febbraio 2009, 19:12:12
ovviamente esito !!!
Titolo: Re: IF/ELSE e processi
Inserito da: leo72 - 14 Febbraio 2009, 23:25:19
Ops... ho fatto un po' di casino col copia-e-incolla :-P