 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 11.11.2007, 12:21 Titel: Prozessorauslastung herausfinden |
|
|
Hallo Leute,
habt ihr zufällig ne Idee, wie man mit QBasic die CPU-Auslastung überprüfen kann? - Geht das überhaupt?
Notfalls auch Betriebssystemabhängig (Es handelt sich um WIN2000 Prof)
- Wäre allerdings dann ja nich ganz so toll
MfG
Type |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 11.11.2007, 12:22 Titel: |
|
|
Wenn du den Patch nicht installiert hast geht das ganz einfach:
 |
|
Nach oben |
|
 |
Manuel

Anmeldungsdatum: 23.10.2004 Beiträge: 1271 Wohnort: Bayern
|
Verfasst am: 11.11.2007, 12:28 Titel: |
|
|
Kurze Antwort: Geht nicht.
Lange Antwort: QBasic ist ein Programm aus MS-DOS-Zeiten. Zu dieser Zeit gab es sowas wie Multitasking (mehrere Programme im Speicher halten und denen bestimmte Prioritäten zuweisen) garnicht.
Unter Windows 2000 ist MS-DOS garnicht mehr vorhanden; Windows emuliert bei QBasic den DOS-Modus nur. Allerdings - das müsstest du schon herausgefunden haben - belegt QBasic selber beim Start fast die gesamte CPU-Last. Es gibt keine Möglichkeit von QBasic aus, bei einem Multitask-Betriebssystem (wie Windows es ist) die CPU-Last auszulesen. Für QBasic gibt es kein Windows im Hintergrund, QBasic meint, es sei das einzige Programm im Speicher (was zu Zeiten von MS-DOS auch nicht anders möglich war).
Eine Alternative würde wohl statt QBasic FreeBasic darstellen. Das Ding kann direkt Windowsprogramme erstellen und natürlich auch auf Windows-Funktionen (wie eben die CPU-Last auszulesen) zugreifen. Die Syntax (= wie man die Befehle schreibt) ist zu ca. 90% identisch mit QBasic. Leider bin ich in FreeBasic nicht so bewandert, aber ich bin mir sicher, dass das ein anderer User besser erklären kann als ich^^. _________________ DL Walk (Denkspiel) | DL Malek (Denkspiel) | DL Warrior (ASCII-Adventure) | DL Sokodos (Sokoban-Klon)
---
www.astorek.de.vu |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 11.11.2007, 12:42 Titel: |
|
|
ich bin immer wieder erstaunt, wie schnell das hier geht
Danke für die antworten.
Irgendwie hab ich geahnt, dass ich da mit FreeBasic rangehen muss...
Hat jemand ne Idee, wie man das realisieren kann? |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 11.11.2007, 13:13 Titel: |
|
|
Hier habe ich etwas interessantes gefunden.
Ich arbeite dran...
EDIT:
Code: |
#Include "windows.bi"
#Undef HiWord
#Undef LoWord
#Define HiWord(Ausdruck) Ausdruck = CUnsg(Ausdruck) Shr 16 And &hFFFF
#Define LoWord(Ausdruck) Ausdruck = Ausdruck AND 65535
Declare Function GetCPULoad() As Double
Function GetCPULoad() As Double
Static As Dword dwLastProcessTime = 0
Static As Dword dwLastSystemTime = 0
Static As Double dCPULoad = 0
Dim As FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime
GetProcessTimes(GetCurrentProcess(),@ftCreationTime,@ftExitTime,@ftKernelTime,@ftUserTime)
Dim As ULongInt uiKernelTime, uiUserTime
HiWord(uiKernelTime) = ftKernelTime.dwHighDateTime
LoWord(uiKernelTime) = ftKernelTime.dwLowDateTime
HiWord(uiUserTime) = ftUserTime.dwHighDateTime
LoWord(uiUserTime) = ftUserTime.dwLowDateTime
Dim As Dword dwActualProcessTime = Cast(Dword, ((uiKernelTime + uiUserTime)/100))
Dim As Dword dwActualSystemTime = GetTickCount()
If(dwLastSystemTime) Then
dCPULoad = Cast(Double, (dwActualProcessTime-dwLastProcessTime)/(dwActualSystemTime-dwLastSystemTime))
EndIf
dwLastProcessTime = dwActualProcessTime
dwLastSystemTime = dwActualSystemTime
return dCPULoad
End Function
Print "Init: " & GetCPULoad()
Do
Sleep 1000
Print "CPU Auslastung: " & GetCPULoad() & "%"
If InKey = Chr(27) Then Exit Do
Loop
Print "translated by csde_rats..."
Sleep
|
Ist nat. FB Code  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 11.11.2007, 13:42 Titel: |
|
|
Danke für den Code, aber irgendwie zeigt er mir ständig eine Auslastung von 0% an, egal, wie hoch sie in Wirklichkeit ist.
(Wär lustig, wenn ich immer ne Auslastung von 0% hätte )
Wie ich den code (glaub ich) gelesen oder verstanden hab, hast du den ersten geposteten Code von deinem Link 'übersetzt'. Ich glaube der hat auch in C++ Form nicht richtig funktioniert...
Auf Seite vier gibt es ein kleines Codeschnippsel, was angeblich laufen soll.
Außerdem hab ich auf der Seite gelesen, dass man die CPU-Last mit einem Registryeintrag auslesen kann. Allerdings war der angegebe Eintrag nur für Win9x was bei 2000 ja nix bringt.
Gibt es so einen Eintrag auch für NT-Systeme?
Bzw. Wie kann ich die Registry über QBasic/FreeBasic auslesen? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 11.11.2007, 14:37 Titel: |
|
|
In der Registry steht die auslastung bestimmt nicht. Aber die Registry auslesen ist sowieso ein bisschen aufwändiger...
Mir fällt auf anhieb kein FB-Sourcecode ein, aber ein alter bekannter von mir hat das in VB so gelöst: http://home.arcor.de/visualbasicforum/vbtutorials.htm
EDIT: LEET post  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.

Zuletzt bearbeitet von Jojo am 11.11.2007, 14:47, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 11.11.2007, 14:39 Titel: |
|
|
Ja, man kann die Registry mit FreeBasic auslesen.
Ich weiß nicht, evtl. befindet sich ein Beispiel im examples-Ordner deiner FB-Installation. (Aktuelle Version verwenden!)
Andernfalls ließe sich da doch bestimmt was in der MSDN Library finden. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 11.11.2007, 14:47 Titel: |
|
|
Aber was bringt mir die Registry, wenn ich nicht weis, wo oder ob die Prozessorauslastung da drin steht.
Auf jeden Fall gab es einen solchen Eintrag unter Win 9x, da bin ich mir sicher.
Ich habe gerade, Google sei (ausnahmsweise mal ) dank, eine Seite gefunden in der ein VB(A) Script die Prozessorauslastung ausliest.
http://www.activevb.de/tipps/vb6tipps/tipp0615.html
Leider hab ich
1. Keine Ahnung wie man den zum Laufen kriegt
2. Kann man VBA-Scripte nich kompilieren (Ansonsten könnte man ja ne EXE erstellen, die die Auslastung zurückgibt)
Außerdem hab ich keinen Plan von VB.
MfG Type |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 11.11.2007, 14:50 Titel: |
|
|
Type hat Folgendes geschrieben: | Aber was bringt mir die Registry, wenn ich nicht weis, wo oder ob die Prozessorauslastung da drin steht.
Auf jeden Fall gab es einen solchen Eintrag unter Win 9x, da bin ich mir sicher. |
das ist sinnlos, weil das dauerhafter HDD-Zugriff bedeuten würde und die Registry sehr anfällig gegenüber stromausfällen wäre. Die Registry wurde für sowas auch gar nicht geschaffen, daher bin ich mir zu 99,99% sicher, dass du da was anderes meinst...
VB ist fast wie FB... Du musst wirklich nicht viel umbauen, bei diesen codes... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 11.11.2007, 20:42 Titel: |
|
|
Es kommt mir so vor als wäre das ein Ding der Unmöglichkeit.
Ich habe jetzt schon absolut erfolglos mindestens 5 oder 6 C/C++ Codes oder VB Codes übersetzt
Code: |
'clsCPUUsageNT- copyright © 2001, The KPD-Team
'Visit our site at http://www.allapi.net
'or email us at KPDTeam@allapi.net
#Include "vbcompat.bi"
'mdlMisc - copyright © 2001, The KPD-Team
'Visit our site at http://www.allapi.net
'or email us at KPDTeam@allapi.net
Const SPACER = 5
Const BAR_WIDTH = 50
Const HWND_TOPMOST = -1&
Const HWND_NOTOPMOST = -2&
Const SWP_NOSIZE = &H1&
Const SWP_NOMOVE = &H2&
Const SWP_NOACTIVATE = &H10&
Const SWP_SHOWWINDOW = &H40&
Const THREAD_BASE_PRIORITY_MAX = 2
Const HIGH_PRIORITY_CLASS = &H80
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Declare Function GetCurrentThread Lib "kernel32" () As Long
Declare Function GetCurrentProcess Lib "kernel32" () As Long
Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
#Define Currency LongInt
Const vbCritical = "vbCritical"
Const SYSTEM_BASICINFORMATION = 0&
Const SYSTEM_PERFORMANCEINFORMATION = 2&
Const SYSTEM_TIMEINFORMATION = 3&
Const NO_ERROR = 0
Type LARGE_INTEGER
dwLow As Long
dwHigh As Long
End Type
Type SYSTEM_BASIC_INFORMATION
dwUnknown1 As Long
uKeMaximumIncrement As Long
uPageSize As Long
uMmNumberOfPhysicalPages As Long
uMmLowestPhysicalPage As Long
uMmHighestPhysicalPage As Long
uAllocationGranularity As Long
pLowestUserAddress As Long
pMmHighestUserAddress As Long
uKeActiveProcessors As Long
bKeNumberProcessors As Byte
bUnknown2 As Byte
wUnknown3 As Integer
End Type
Type SYSTEM_PERFORMANCE_INFORMATION
liIdleTime As LARGE_INTEGER
dwSpare(0 To 75) As Long
End Type
Type SYSTEM_TIME_INFORMATION
liKeBootTime As LARGE_INTEGER
liKeSystemTime As LARGE_INTEGER
liExpTimeZoneBias As LARGE_INTEGER
uCurrentTimeZoneId As Long
dwReserved As Long
End Type
Declare Function LI2Currency(liInput As LARGE_INTEGER) As Currency
Dim ntdll As Any Ptr = DylibLoad("ntdll.dll")
Dim Shared NtQuerySystemInformation As Function (ByVal dwInfoType As Long, ByVal lpStructure As Long, ByVal dwSize As Long, ByVal dwReserved As Long) As Long
NtQuerySystemInformation=DylibSymbol(ntdll, "NtQuerySystemInformation")
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any Ptr , pSrc As Any Ptr , ByVal ByteLen As Long)
Dim Shared liOldIdleTime As LARGE_INTEGER
Dim Shared liOldSystemTime As LARGE_INTEGER
Sub Initialize()
Dim SysTimeInfo As SYSTEM_TIME_INFORMATION
Dim SysPerfInfo As SYSTEM_PERFORMANCE_INFORMATION
Dim Ret As Long
'get new system time
Ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, VarPtr(SysTimeInfo), Len(SysTimeInfo), 0&)
If Ret <> NO_ERROR Then
Print "Error while initializing the system's time!", vbCritical
Exit Sub
End If
'get new CPU's idle time
Ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, VarPtr(SysPerfInfo), Len(SysPerfInfo), ByVal 0&)
If Ret <> NO_ERROR Then
Print "Error while initializing the CPU's idle time!", vbCritical
Exit Sub
End If
'store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime
liOldSystemTime = SysTimeInfo.liKeSystemTime
End Sub
Function Query() As Long
Dim SysBaseInfo As SYSTEM_BASIC_INFORMATION
Dim SysPerfInfo As SYSTEM_PERFORMANCE_INFORMATION
Dim SysTimeInfo As SYSTEM_TIME_INFORMATION
Dim dbIdleTime As Currency
Dim dbSystemTime As Currency
Dim Ret As Long
Query = -1
'get number of processors in the system
Ret = NtQuerySystemInformation(SYSTEM_BASICINFORMATION, VarPtr(SysBaseInfo), Len(SysBaseInfo), 0&)
If Ret <> NO_ERROR Then
Print "Error while retrieving the number of processors!", vbCritical
Exit Function
End If
'get new system time
Ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, VarPtr(SysTimeInfo), Len(SysTimeInfo), 0&)
If Ret <> NO_ERROR Then
Print "Error while retrieving the system's time!", vbCritical
Exit Function
End If
'get new CPU's idle time
Ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, VarPtr(SysPerfInfo), Len(SysPerfInfo), ByVal 0&)
If Ret <> NO_ERROR Then
Print "Error while retrieving the CPU's idle time!", vbCritical
Exit Function
End If
'CurrentValue = NewValue - OldValue
dbIdleTime = LI2Currency(SysPerfInfo.liIdleTime) - LI2Currency(liOldIdleTime)
dbSystemTime = LI2Currency(SysTimeInfo.liKeSystemTime) - LI2Currency(liOldSystemTime)
'CurrentCpuIdle = IdleTime / SystemTime
If dbSystemTime <> 0 Then dbIdleTime = dbIdleTime / dbSystemTime
'CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100 - dbIdleTime * 100 / SysBaseInfo.bKeNumberProcessors + 0.5
Query = Int(dbIdleTime)
'store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime
liOldSystemTime = SysTimeInfo.liKeSystemTime
End Function
Function LI2Currency(liInput As LARGE_INTEGER) As Currency
Dim As Currency Retur
'CopyMemory LI2Currency, liInput, LenB(liInput)
CopyMemory @Retur, @liInput, Len(liInput)
Return Retur
End Function
Sub Terminate()
'nothing to do
End Sub
Initialize()
Do
Print Query()
Loop
|
_________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 11.11.2007, 23:20 Titel: |
|
|
Ein schöner Weg ist sonst die Verwendung von Win32_Processor der Windows Management Instrumentation. Wie man dies aus QB heraus nutzt, zeigt
http://beilagen.dreael.ch/QB/CPULOAD.BAS
d.h. wir verwenden dort wieder einmal unser berühmtes temporäre WSH-Script.
Hinweis: Über WMI kann man beinahe alles im Windows-Betriebssystem abfrage und z.T. auch Operationen durchführen. WMI wird übrigens auch in Vista mit der neuen PowerShell unterstützt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 12.11.2007, 09:48 Titel: |
|
|
csde_rats hat Folgendes geschrieben: | Wenn ich das richtig sehe, kann man jedoch die WMI nicht aus FB heraus verwenden ;) |
WMI kannst Du aus FreeBasic genauso verwenden! In der primitiven Variante auch mit dem temporären .VBS und SHELL-Befehl wie in QB.
Aber vermutlich kann FB sogar mit COM sogar direkt umgehen, dann kannst Du sogar die notwendigen Objekte direkt instanzieren und Methoden aufrufen, womit der Umweg entfällt.
COM-Unterstützung wäre ein wichtiger Punkt, den man mit den FB-Entwicklern einmal ausdiskutieren müsste! Denn wie alle meine vielen sonstigen Beispiele aus der Vergangenheit zeigen, läuft bei Windows das Meiste nun einmal über COM!
In jüngster Zeit müsste man sogar über eine FreeBasic-Nachfolgeprojekt FreeBasic.NET oder kurz FB# einmal nachdenken, d.h. spezieller FreeBasic-Dialekt, welcher CIL anstelle x86-nativer .EXEs erzeugt und selbstverständlich die Datentypen 100% denjenigen des .NET-Frameworks entsprechen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 12.11.2007, 17:50 Titel: |
|
|
Hab mal ein bisschen recherchiert. An sich wäre es relativ einfach, wenn es ein command line tool gäbe, das die CPU-Auslastung anzeigt, so wie es der Task Manager grafisch tut. (Dann könnte man es via SHELL() aufrufen, die Ausgabe in eine Datei pipen lassen und diese dann wieder in QBASIC auslesen.)
Aber weder bei sysinternals noch bei den Gnu Utilities hat sich da was gefunden. Meine schnelle Recherche bei sourceforge hat auch nichts brauchbares ergeben. Aber vielleicht findet ja jemand anderes noch was. An sich ne interessante Frage...
Grüsse!
Croco |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 12.11.2007, 19:12 Titel: |
|
|
Also ich habe jetzt schon mehrere Stunde gesucht, die Frage wird wohl auch häufig beantwortet, nur scheints so, als gäbe es kaum richtig funktionierende Lösungen dafür... _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Type
Anmeldungsdatum: 24.02.2006 Beiträge: 187 Wohnort: Dresden
|
Verfasst am: 13.11.2007, 21:43 Titel: |
|
|
Hallo Leute,
also das Programm von Dreael hat mir sehr geholfen - Danke!
Das war genau das, was ich gesucht hab. - Ok vielleicht nicht sonderlich elegant, aber es tut genau das, was es soll
MfG Type |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|