Differenze tra le versioni di "Conoscere in tempo reale il numero dell'ultimo processo appena aperto"

Da Gambas-it.org - Wikipedia.
Riga 11: Riga 11:
 
   Dim s As String
 
   Dim s As String
 
    
 
    
  s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
+
  s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
 
    
 
    
  Print s
+
  Print s
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 26: Riga 26:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  With Timer1
+
  With Timer1
    .delay = 200
+
    .delay = 200
    .Start
+
    .Start
  End With
+
  End With
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub Timer1_Timer()   
 
  '''Public''' Sub Timer1_Timer()   
Riga 38: Riga 37:
 
   Dim s As String
 
   Dim s As String
 
   Dim ss As String[]
 
   Dim ss As String[]
+
 
 
  <FONT color=gray>' ''Ogni ms 200 si legge tutto il contenuto della cartella "proc".''
 
  <FONT color=gray>' ''Ogni ms 200 si legge tutto il contenuto della cartella "proc".''
 
  ' ''Se il contenuto letto è una cartella, allora vuol dire che si tratta di un processo.''
 
  ' ''Se il contenuto letto è una cartella, allora vuol dire che si tratta di un processo.''
 
  ' ''Risulterà visibile, come effetto, l'ultimo processo in ordine di tempo aperto:''</font>
 
  ' ''Risulterà visibile, come effetto, l'ultimo processo in ordine di tempo aperto:''</font>
  For Each s In Dir("/proc", Null, gb.Directory)
+
  For Each s In Dir("/proc", Null, gb.Directory)
    TextEdit1.RichText = "Processo: " & s
+
    TextEdit1.RichText = "Processo: " & s
  Next
+
  Next
 
    
 
    
  If Exist("/proc" &/ s &/ "cmdline") Then
+
  If Exist("/proc" &/ s &/ "cmdline") Then
    ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
+
    ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
    TextEdit1.RichText &= "Programma esecutore:&lt;BR>" & String@(Pointer@(ss.Data)) &
+
    TextEdit1.RichText &= "Programma esecutore:&lt;BR>" & String@(Pointer@(ss.Data)) &
    "&lt;P>File eseguito:&lt;BR>" & String@(Pointer@(ss.Data + 32))
+
    "&lt;P>File eseguito:&lt;BR>" & String@(Pointer@(ss.Data + 32))
  Endif
+
  Endif
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 17:16, 6 ott 2021

Per conoscere l'ultimo processo avviato bisognerà interrogare la cartella proc del File System.

Vediamo di seguito un paio di modalità.

Leggere il file /proc/loadavg

Il modo più semplice, per conoscere l'ultimo processo avviato, è quello di leggere l'ultimo campo a destra presente nel file di testo loadavg prtesente nella Cartella di /proc .

Esempio:

Public Sub Main()

 Dim s As String
 
 s = Scan(File.Load("/proc/loadavg"), "* */* *")[3]
 
 Print s
 
End


Verificare le sub-cartelle dei processi aperti

In tale modalità si controlleranno le sottocartelle presenti nella cartella di /proc, verificando ogni tot tempo la presenza di una nuova Cartella relativa ad un processo. La Cartella, avente come nome il numero più elevato in quel momento, apparterrà al più recente processo avviato.

Nell'esempio, che segue, si andrà a leggere nella cartella /proc ogni 200 millesimi di secondo mediante l'attivazione di un Timer, per conoscere in tempo reale il numero dell'ultimo processo appena aperto, nonché il file lanciato ed il suo programma esecutore.

In sostanza si dovrà prima lanciare il codice Gambas, sotto descritto, e successivamente aprire un qualsiasi programma.

Public Sub Form_Open()

 With Timer1
   .delay = 200
   .Start
 End With
 
End

Public Sub Timer1_Timer()  

 Dim s As String
 Dim ss As String[]
 
' Ogni ms 200 si legge tutto il contenuto della cartella "proc".
' Se il contenuto letto è una cartella, allora vuol dire che si tratta di un processo.
' Risulterà visibile, come effetto, l'ultimo processo in ordine di tempo aperto:
 For Each s In Dir("/proc", Null, gb.Directory)
   TextEdit1.RichText = "Processo: " & s
 Next
  
 If Exist("/proc" &/ s &/ "cmdline") Then
   ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
   TextEdit1.RichText &= "Programma esecutore:<BR>" & String@(Pointer@(ss.Data)) &
   "<P>File eseguito:<BR>" & String@(Pointer@(ss.Data + 32))
 Endif

End

Il medesimo esempio, ma con un'applicazione a riga di comando

Se l'applicazione Gambas è a riga di comando, potremo servirci di un ciclo, dal quale si uscirà soltanto quando sarà stato aperto un nuovo processo:

Public Sub Main()

 Dim c As Short
 Dim s As String
 Dim ss As String[]

' Verifichiamo inizialmente quante cartelle sono presenti in "/proc":
 c = Dir("/proc", Null, gb.Directory).Count
 
 Repeat
   Wait 0.1
 Until c < Dir("/proc", Null, gb.Directory).Count
 
' L'ultima cartella dell'indice del vettore generato dalla funzione "Dir()" è l'ultimo processo appena aperto:
 s = Dir("/proc", Null, gb.Directory)[Dir("/proc", Null, gb.Directory).Max]

' Oppure anche così:
' For Each s In Dir("/proc", Null, gb.Directory)
'   If IsDigit(s) Then s = s
' Next
      
 Print "Processo: "; s

 If Exist("/proc" &/ s &/ "cmdline") Then
   ss = Split(File.Load("/proc" &/ s &/ "cmdline"), "/")
   Print "Esecutore:  "; String@(Pointer@(ss.Data))
   Print "File eseguito:  "; String@(Pointer@(ss.Data + (8 * ss.Max)))
 Endif
 
End