Visualizzare il tempo trascorso dall'ultimo avvio del sistema

Da Gambas-it.org - Wikipedia.

Per visualizzare il tempo trascorso dall'ultimo avvio del proprio sistema, sarà possibile utilizzare almeno tre possibilità.


Lettura del file /proc/uptime mediante le sole funzioni di Gambas

Con questa modalità si andrà a leggere mediante le sole funzioni di Gambas il primo dato presente nel file: /proc/uptime. Otterremo qui questo risultato senza l'uso di Shell.

Nella routine principale apriremo il file "/proc/uptime", ponendolo sotto osservazione ai soli fini di far sollevare l'evento di lettura, e così di leggere con una nuova e diversa apertura del medesimo file i dati utili, ogni qual volta vi sono dati appunto da leggere.

Una lettura diretta del file nella routine "File_Read()" mediante la variabile di tipo File, ottenuta con l'istruzione Open della routine principale Sub Main(), non risulta possibile: seppure assenti errori, non vengono restituiti dati.


Mostriamo un esempio pratico:

Private fl As File


Public Sub Main()
 
' Apriamo il file solo per far sollevare l'evento di lettura ogni qual volta v'è qualcosa di nuovo da leggervi:
 fl = Open "/proc/uptime" For Read Watch

End



Public Sub File_Read()
 
 Dim s As String
 Dim ar As File

' Apriamo nuovamente il file, ma ora per la lettura e la conseguente raccolta dei dati:
 ar = Open "/proc/uptime" For Input

' Leggiamo solo i primi 7 byte del flusso:
 Input #ar, s

' Viene finalmente mostrato il risultato in console:
 Write "\r" & s & "   " & CStr(Date(0, 0, 0, 0, 0, 0, CSingle(s) * 1000))
 
 ar.Close
 
End


Uso della libreria esterna di GStreamer

Mostriamo di seguito due modalità utilizzando alcune funzioni della libreria esterna di GStreamer. Sarà ovviamente necessario richiamare nell'applicazione Gambas la libreria dinamica condivisa: "libgstreamer-1.0.so.0.204.0"


1a modalità: Questa modalità prevede l'uso della funzione esterna gst_util_get_timestamp() del API di GStreamer. Tale funzione esterna restituisce dei marcatori temporali, espressi in nanosecondi (miliardesimi di secondo) dall'avvio della corrente sessione del sistema, ed utilizzati solitamente per misurare degli intervalli di tempo.

Mostriamo un semplicissimo esempio, nel quale verrà raccolto con un ciclo all'infinito il tempo (espresso in nanosecondi) trascorso dall'avvio della sessione di sistema:

Library "libgstreamer-1.0"

' GstClockTime gst_util_get_timestamp (void)
' Get a timestamp as GstClockTime to be used for interval measurements.
Private Extern gst_util_get_timestamp() As Long


Public Sub Main()

 Dim l As Long
 
  While True
    l = gst_util_get_timestamp()
    Write "\r" & l & "   " & CStr(Date(0, 0, 0, 0, 0, 0, l \ 1000000))
  Wend

End


2a modalità: Quest'altra modalità prevede l'uso delle funzioni esterne gst_system_clock_obtain() e gst_clock_get_time() del API di GStreamer.

Anche in questa modalità verrà raccolto con un ciclo all'infinito il tempo (espresso in nanosecondi) trascorso dall'avvio della sessione di sistema:

Library "libgstreamer-1.0"

' GstClock * gst_system_clock_obtain (void)
' Get a handle to the default system clock.
Private Extern gst_system_clock_obtain() As Pointer

' GstClockTime gst_clock_get_time (GstClock *clock)
' Get the current time of the given clock.
Private Extern gst_clock_get_time(GstClock As Pointer) As Long
 

Public Sub Main()

 Dim clock, id As Pointer
 Dim l As Long

 clock = gst_system_clock_obtain()
 
 While True
   l = gst_clock_get_time(clock)
   Write "\r" & l & "   " & CStr(Date(0, 0, 0, 0, 0, 0, l \ 1000000))
 Wend

End


Uso della libreria esterna libc.so.6

Questa terza possibilità fa uso della libreria di sistema sysinfo.h, le cui risorse sono richiamabili attraverso la libreria dinamica condivisa lib.so.6 .

In particolare dovremo utilizzare la Struttura esterna, chiamata sysinfo, nonché utilizzare la omonima funzione esterna sysinfo().


Mostriamo un esempio pratico:

Library "libc:6"

Public Struct sysinfo
  uptime As Long
  loads[3] As Long
  totalram As Long
  freeram As Long
  sharedram As Long
  bufferram As Long
  totalswap As Long
  freeswap As Long
  procs As Short
  pad As Short
  totalhigh As Long
  freehigh As Long
  mem_unit As Integer
End Struct
 
' int sysinfo (struct sysinfo *__info)
' Returns information on overall system statistics.
Private Extern sysinfo(info As Sysinfo) As Integer


Public Sub Main()
 
 Dim si As New Sysinfo
 Dim err As Integer
   
 err = sysinfo(si)
 If err < 0 Then Error.Raise("Il puntatore alla Struttura 'sysinfo' non è valido !")
 
 Print "Tempo dall'avvio del sistema:   "; Date(0, 0, 0, 0, 0, 0, CInt(si.uptime * 1000))
  
End