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
 
  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 "== 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