Visualizzare il tempo trascorso dall'ultimo avvio del sistema
Vediamo di seguito alcune modalità per visualizzare il tempo trascorso dall'ultimo avvio del proprio sistema.
Indice
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