Visualizzare il tempo trascorso dall'ultimo avvio del sistema

Da Gambas-it.org - Wikipedia.

Vediamo di seguito alcune modalità per visualizzare il tempo trascorso dall'ultimo avvio del proprio sistema.

Uso della Classe X11

Questa modalità richiede che siano attivati i Componenti gb.desktop e gb.desktop.x11, e che venga utilizzata la Proprietà ".Time" della Classe "X11".
Questa Proprietà restituisce un "Intero" che rappresenta i millesimi di secondo trascorsi dall'avvio del sistema.

Esempio pratico:

Public Sub Button1_Clic()

 Do
   Me.Title = Format(Time(0, 0, 0, X11.Time), "hh:nn:ss.uuu")
   Wait 0.001
 Loop

End

Lettura del file /proc/uptime

Con questa modalità si andrà a leggere il primo dato presente nel file: /proc/uptime.

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.
Il file "/proc/uptime " contiene sulla medesima riga due dati numerici separati da uno spazio. A noi interessa il primo da sinistra, pertanto verrà usato il comando "Input", dato che questo comando legge una stringa di caratteri sino al primo spazio (escluso) incontrato.

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 "\rsec. = " & s & "   " & CStr(Time(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 condivisa: "libgstreamer-1.0.so.0.2403.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:0.2403.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
 
 Do
   l = gst_util_get_timestamp()
   Write "\rTempo trascorso dall'avvio: " & Time(0, 0, 0, l \ 1000000)
   Wait 0.001
 Loop

End

2a modalità usando l'API di GStreamer

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:0.2403.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()

 Do
   l = gst_clock_get_time(clock)
   Write "\rTempo trascorso dall'avvio: " & Time(0, 0, 0, l \ 1000000)
   Wait 0.001
 Loop

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
 
 Do
   err = sysinfo(si)
   If err < 0 Then Error.Raise("Errore !")
   Write "\rTempo dall'avvio del sistema:   " & Time(0, 0, 0, CInt(si.uptime * 1000))
   Wait 0.01
 Loop

End