Ottenere informazioni generali sulla CPU con le sole risorse di Gambas

Da Gambas-it.org - Wikipedia.

E' possibile ottenere con le sole risorse di Gambas alcune informazioni generali sulla CPU analizzando i file contenuti nella cartella di sistema /sys/devices/system/cpu e nelle sue sub-cartelle.

Ne mostriamo un possibile codice:

Public Sub Main()

 Dim s, v, cpu, sys As String

 Print "Numero dei processori presenti: "; System.Cores

 sys = "/sys/devices/system/cpu"
  
 If Not Exist(sys) Then Error.Raise("Impossibile trovare il percorso contenente le cartelle delle CPU !")

 For Each cpu In Dir(sys, "cpu*", gb.Directory)
   If IsDigit(Right(cpu, 1)) Then
     Print "\n\n== Analisi "; cpu; " =="
     Print "Driver: "; Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_driver"), "\n", Null)
     Print "Latenza massima di transizione: "; Durata(Replace(File.Load(sys &/ cpu &/ "cpufreq/cpuinfo_transition_latency"), "\n", Null))
     s = Velocitas(Replace(File.Load(sys &/ cpu &/ "cpufreq/cpuinfo_max_freq"), "\n", Null)) & "  " & Velocitas(Replace(File.Load(sys &/ cpu &/ "cpufreq/cpuinfo_min_freq"), "\n", Null))
     Print "Limiti hardware: "; s
     s = Null
     For Each v In Split(Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_available_frequencies"), "\n", Null), " ")
       If IsDigit(v) Then s &= Velocitas(v) & "  "
     Next
     Print "Salti di frequenze disponibili: "; s
     Print "Regolatori di frequenza della CPU disponibili: "; Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_available_governors"), "\n", Null)
     s = Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_governor"), "\n", Null) & "' può impostare la frequenza fra "
     s &= Velocitas(Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_max_freq"), "\n", Null)) & " e " & Velocitas(Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_min_freq"), "\n", Null))
     Print "Il regolatore '"; s
     Print "L'attuale frequenza della CPU è: "; Velocitas(Replace(File.Load(sys &/ cpu &/ "cpufreq/scaling_cur_freq"), "\n", Null))
     Print
   Endif
 Next

End


Private Function Durata(d As String) As String

 Dim tmp, dur As Long

 dur = Val(d)
 
 If dur > 1000000 Then
   tmp = dur Mod 10000
   If tmp >= 5000 Then dur += 10000
   Return CStr(dur / 1000000) & "," & CStr((dur Mod 1000000) / 10000) & " ms"
 Else If dur > 100000 Then
   tmp = dur Mod 1000
   If tmp >= 500 Then dur += 1000
   Return CStr(dur / 1000) & " us"
 Else If dur > 1000 Then
   tmp = dur Mod 100
   If tmp >= 50 Then dur += 100
   Return CStr(dur / 1000) & "," & CStr((dur Mod 1000) / 100) & " us"
 Else
   Return CStr(dur) & " ns"
 Endif

End


Private Function Velocitas(v As String) As String

 Dim tmp, vel As Long

 vel = Val(v)

 If vel > 1000000 Then
   tmp = vel Mod 10000
   If (tmp >= 5000) Then vel += 10000
   Return CStr(vel \ 1000000) & "," & CStr((vel Mod 1000000) / 10000) & " GHz"
 Else If vel > 100000 Then
   tmp = vel Mod 1000
   If tmp >= 500 Then vel += 1000
   Return CStr(vel / 1000) & " MHz"
 Else If vel > 1000
   tmp = vel Mod 100
   If tmp >= 50 Then vel += 100
   Return CStr(vel / 1000) & "," & CStr((vel Mod 1000) / 100)
 Else
   Return CStr(vel) & " KHz"
 Endif

End