![]() |
Problem mit JEDI (Gleitkommadivision durch NULL)
moin,
Ich wollte in meinem Projekt das JEDI IP-Eingabe-Edit verwenden: Beim Starten erhalte ich aber nun die Fehlermeldung "Gleitkommadivision durch Null" und Delphi springt in die Unit "JclSysInfo" und markiert die letzte Zeile der procedure "GetCpuInfo". Ich konnte das Problem soweit eingrenzen, dass es wohl nicht direkt an der IP-Kompo liegt, sondern viel mehr an der, durch die Verwendung der Kompo eingebundenen, Unit "JvComCtrls" liegt. Ein ähnlicher/der gleiche Fehler wurde schon ![]() PS: ich verwende die Version "Release 2.10 Stable mit JCL und Installer" erhältlich auf ![]() |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
Hallo xineohp,
es liegt daran, daß die JCL der 2.1 zu alt ist. Du mußt entweder die gesamte JCL austauschen, was vielleicht dazuführen wird, daß Du die JVCL nicht mehr compilieren kannst oder Du tauscht einfach nur den Code der Funktion "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;" in der "JclSysInfo.pas" aus. Letzters geht schneller und unkomplizierter. Alter Code der "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;"
Delphi-Quellcode:
Neuer Code der "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;"
//--------------------------------------------------------------------------------------------------
function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean; var T0, T1: TULargeInteger; CountFreq: TULargeInteger; Freq, Freq2, Freq3, Total: Integer; TotalCycles, Cycles: Int64; Stamp0, Stamp1: Int64; TotalTicks, Ticks: Cardinal; Tries, Priority: Integer; Thread: THandle; begin Stamp0 := 0; Stamp1 := 0; Freq := 0; Freq2 := 0; Freq3 := 0; Tries := 0; TotalCycles := 0; TotalTicks := 0; Total := 0; Thread := GetCurrentThread(); Result := QueryPerformanceFrequency(Int64(CountFreq)); if Result then begin while ((Tries < 3 ) or ((Tries < 20) and ((Abs(3 * Freq - Total) > 3) or (Abs(3 * Freq2 - Total) > 3) or (Abs(3 * Freq3 - Total) > 3)))) do begin Inc(Tries); Freq3 := Freq2; Freq2 := Freq; QueryPerformanceCounter(Int64(T0)); T1.LowPart := T0.LowPart; T1.HighPart := T0.HighPart; Priority := GetThreadPriority(Thread); if Priority <> THREAD_PRIORITY_ERROR_RETURN then SetThreadPriority(Thread, THREAD_PRIORITY_TIME_CRITICAL); try while (T1.LowPart - T0.LowPart) < 50 do begin QueryPerformanceCounter(Int64(T1)); Stamp0 := ReadTimeStampCounter; end; T0.LowPart := T1.LowPart; T0.HighPart := T1.HighPart; while (T1.LowPart - T0.LowPart) < 1000 do begin QueryPerformanceCounter(Int64(T1)); Stamp1 := ReadTimeStampCounter; end; finally if Priority <> THREAD_PRIORITY_ERROR_RETURN then SetThreadPriority(Thread, Priority); end; Cycles := Stamp1 - Stamp0; Ticks := T1.LowPart - T0.LowPart; Ticks := Ticks * 100000; Ticks := Round(Ticks / (CountFreq.LowPart / 10)); TotalTicks := TotalTicks + Ticks; TotalCycles := TotalCycles + Cycles; Freq := Round(Cycles / Ticks); Total := Freq + Freq2 + Freq3; end; Freq3 := Round((TotalCycles * 10) / TotalTicks); Freq2 := Round((TotalCycles * 100) / TotalTicks); if Freq2 - (Freq3 * 10) >= 6 then Inc(Freq3); CpuSpeed.RawFreq := Round(TotalCycles / TotalTicks); CpuSpeed.NormFreq := CpuSpeed.RawFreq; Freq := CpuSpeed.RawFreq * 10; if (Freq3 - Freq) >= 6 then Inc(CpuSpeed.NormFreq); CpuSpeed.ExTicks := TotalTicks; CpuSpeed.InCycles := TotalCycles; CpuSpeed.NormFreq := RoundFrequency(CpuSpeed.NormFreq); Result := True; end; end;
Delphi-Quellcode:
bye
//--------------------------------------------------------------------------------------------------
function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean; {$IFDEF LINUX} begin { TODO : GetCPUSpeed: Solution for Linux } Result := False; end; {$ENDIF LINUX} {$IFDEF MSWINDOWS} var T0, T1: Int64; CountFreq: Int64; Freq, Freq2, Freq3, Total: Int64; TotalCycles, Cycles: Int64; Stamp0, Stamp1: Int64; TotalTicks, Ticks: Double; Tries, Priority: Integer; Thread: THandle; begin Stamp0 := 0; Stamp1 := 0; Freq := 0; Freq2 := 0; Freq3 := 0; Tries := 0; TotalCycles := 0; TotalTicks := 0; Total := 0; Thread := GetCurrentThread(); Result := QueryPerformanceFrequency(CountFreq); if Result then begin while ((Tries < 3 ) or ((Tries < 20) and ((Abs(3 * Freq - Total) > 3) or (Abs(3 * Freq2 - Total) > 3) or (Abs(3 * Freq3 - Total) > 3)))) do begin Inc(Tries); Freq3 := Freq2; Freq2 := Freq; QueryPerformanceCounter(T0); T1 := T0; Priority := GetThreadPriority(Thread); if Priority <> THREAD_PRIORITY_ERROR_RETURN then SetThreadPriority(Thread, THREAD_PRIORITY_TIME_CRITICAL); try while T1 - T0 < 50 do begin QueryPerformanceCounter(T1); Stamp0 := ReadTimeStampCounter; end; T0 := T1; while T1 - T0 < 1000 do begin QueryPerformanceCounter(T1); Stamp1 := ReadTimeStampCounter; end; finally if Priority <> THREAD_PRIORITY_ERROR_RETURN then SetThreadPriority(Thread, Priority); end; Cycles := Stamp1 - Stamp0; Ticks := T1 - T0; Ticks := Ticks * 100000; // avoid division by zero if CountFreq = 0 then Ticks := High(Int64) else Ticks := Ticks / (CountFreq / 10); TotalTicks := TotalTicks + Ticks; TotalCycles := TotalCycles + Cycles; // avoid division by zero if Ticks = 0 then Freq := High(Freq) else Freq := Round(Cycles / Ticks); Total := Freq + Freq2 + Freq3; end; // avoid division by zero if TotalTicks = 0 then begin Freq3 := High(Freq3); Freq2 := High(Freq2); CpuSpeed.RawFreq := High(CpuSpeed.RawFreq); end else begin Freq3 := Round((TotalCycles * 10) / TotalTicks); // freq. in multiples of 10^5 Hz Freq2 := Round((TotalCycles * 100) / TotalTicks); // freq. in multiples of 10^4 Hz CpuSpeed.RawFreq := Round(TotalCycles / TotalTicks); end; CpuSpeed.NormFreq := CpuSpeed.RawFreq; if Freq2 - (Freq3 * 10) >= 6 then Inc(Freq3); Freq := CpuSpeed.RawFreq * 10; if (Freq3 - Freq) >= 6 then Inc(CpuSpeed.NormFreq); CpuSpeed.ExTicks := Round(TotalTicks); CpuSpeed.InCycles := TotalCycles; CpuSpeed.NormFreq := RoundFrequency(CpuSpeed.NormFreq); Result := True; end; end; {$ENDIF MSWINDOWS} Claus |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
herzlichen Dank für die Antwort.
Aber sollt man nicht bei einem release erwarten dürfen, dass die einzelnen Komponenten vollständig kompartibel sind? |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
Die Versionen sind doch kompatibel.
Es passt nur eine alte JCL nicht zu einer neuen JVCL. Wir habe uebrigens gerade die naechte Zwischenversion der JVCL 3 Beta herausgebracht. Dazu passt die JCL 1.92. |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
Hallo Robert,
Zitat:
In der Version 3 habe ich das Problem, daß beim kompilieren folgende Fehlermeldung kommt
bye Claus |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
Na die JVCL 2.1 ist halt auch komplett tot aus unserer Sicht. Wir haben keine Manpower die in irgeneiner Weise noch zu unterstuetzen.
Der CharIsNumber-Fehler deutet darauf hin das eine alte JCL gefunden wird. JVCL 2.1 und JVCL 3 lassen sich nicht gemeinsam betreiben. Die JVCL 2.1 und die zugehoerige alte JCL muessen komplett geloescht werden (einschliesslich .bpl .dcu Files). Diese Probleme entstehen daraus das wir gelegentlich Teile der JVCL in die JCL uebernehmen. Es entstehen dann immer Link-Probleme. |
Re: Problem mit JEDI (Gleitkommadivision durch NULL)
Hallo Robert,
ich denke auch, daß es sich um temporäre Übergangsprobleme handelt. Im übrigen habe ich natürlich die 2.1 samt JCL entfernt und das Ganze läuft autark auf einem eigenen Rechner. Bye Claus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz