![]() |
TObjectList problem...
Hallo zusammen,
Ehrlich gesagt habe ich keine Ahnung was los ist, aber irgendwas ist ganz ganz komisch in meiner App. ^^' Ich habe folgende zwei Loops implementier (Schon länger her, aber jetzt bereiten sie mir probleme) nun zum Problem: Nachdem i im ersten Loop 8 erreicht hat. (von 10) und das end des loopes erreicht resp überschritten wird zerschiesst er mir den inhalt der FVoltOVList (die sich im loop unterhalb befindet.). Das heisst dort steht dann nur noch müll in der Liste und wenn ich anschliessend versuche das Objekt auszulesen bekomm ich ne Access vaiolation. Das was mir nicht in den Kopf geht ist, das wirklich bis zu dem Zeitpunkt wo das end überschritten wird alles noch in bester Ordnung ist :-/ Ich habe auch die Loops umgedreht. also zuerst die voltOV und erst dann die Fans... das funktioniert dann bis ich das nächste mal auf die FVoltOVList zugreife und mir ein objekt rausholen will.
Code:
hat jemand eine idee woran das liegen könnte?
For i:= 0 to FFanOvList.Count -1 do begin
FanObject:= FFanOvList[i] as TFanOverlayObject; FanObject.RPM:= ResultRecord.fans[FanObject.RPMArrayPos]; FanObject.NewSpeed := GetNewSpeedForAFan(FanObject); If FanObject.IdleRPM > FanObject.RPM then FanObject.IdleRPM:= FanObject.RPM else If FanObject.LoadRPM < FanObject.RPM then FanObject.LoadRPM:= FanObject.RPM; end; for i := 0 to FVoltOvList.Count - 1 do begin VoltObject:= FVoltOvList[i] as TVoltOverlayObject ; VoltObject.Voltage:= ResultRecord.Volts[VoltObject.VoltArrayPos]/100 ; //FormatFloat('###0.0##',ResultRecord.Volts[VoltObject.VoltArrayPos]/100) If VoltObject.IdleVolt > VoltObject.Voltage then VoltObject.IdleVolt:= VoltObject.Voltage else If VoltObject.LoadVolt < VoltObject.Voltage then VoltObject.LoadVolt:= VoltObject.Voltage; end; Gruss Sev |
AW: TObjectList problem...
wie spielt ResultRecord da mit?
|
AW: TObjectList problem...
Das ist folgender record
Code:
er beinhaltet die Daten die ich auslese das auslesen passiert hier:
TResultIntRecord = Packed Record
Unknown : Array[0..5] of SmallInt;//unbekanntes Tag NumTemps : SmallInt; //Anzahl der Temperaturen NumFans : SmallInt; //Anzahl der Lüfter NumVolts : SmallInt; //Anzahl der Spannungen Temps : Array[0..63] of smallint; //Werte der Temperaturen Fans : Array[0..63] of smallint; //Drehzahl der Lüfter Volts : Array[0..63] of smallint; //Werte der Spannungen end;
Code:
Der wird vor den 2 loops aufgerufen.
var
hSFMemory: HWND; SfAreaPtr: Pointer ; MyResultRecord: TResultIntRecord; begin result:= False; hSFMemory := 0; SfAreaPtr := nil; try hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM'); if HSFMemory <> 0 then begin SfAreaPtr := MapViewOfFile(hSFMemory, FILE_MAP_READ, 0, 0, 0); //CopyMemory nicht machen wenn im debug modus CopyMemory(Addr(FintData),SfAreaPtr,sizeof(MyResultRecord)); if (FIntData.NumFans=0) and (FIntData.NumTemps=0) and (FIntData.NumVolts=0) then begin if FTryesToStartSpeedfan <= 240 then begin inc(FTryesToStartSpeedfan); application.ProcessMessages; Sleep(1000); ReadSFData ; end else begin MessageBox(application.Handle,'No Fan Sensores from Speedfan Found. Shuting down the application ','Failure',MB_OK); Application.Terminate; end; end; Result:= True; end; finally If not result then begin if Fileexists(GPConfiguration.GetValue('SpeedFanExePath','asd')) then begin if not processExists(ExtractFileName(GPConfiguration.GetValue('SpeedFanExePath','asd'))) then ShellExecute(Application.Handle,'open',PChar(ExtractFileName(GPConfiguration.GetValue('SpeedFanExePath',''))),'',PChar(ExtractFilePath(GPConfiguration.GetValue('SpeedFanExePath',''))),SW_SHOW); while FTryesToStartSpeedfan <= 120 do begin if OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM')<> 0 then FTryesToStartSpeedfan:=120 ; Sleep(1000); Application.ProcessMessages; inc(FTryesToStartSpeedfan); end; hSFMemory := OpenFileMapping(FILE_MAP_READ, False, 'SFSharedMemory_ALM'); if HsfMemory = 0 then begin MessageBox(application.Handle,'Failed to Start and Read SpeedFan Data. Make shure that SpeedfanExePath is right in the configuration.','Failure',MB_OK); Application.Terminate; end else begin ReadSFData; FTryesToStartSpeedfan:=0; end; end; end; UnmapViewOfFile(SfAreaPtr); CloseHandle(hSFMemory); end;
Code:
Result:= GPReadSpeedFan.ReadSFData;
ResultRecord:= GPReadSpeedFan.GetResultRecord; |
AW: TObjectList problem...
Zitat:
Delphi-Quellcode:
?
FanObject:= FFanOvList[i].Items as TFanOverlayObject;
|
AW: TObjectList problem...
wie kommst du darauf? Wenn ich das machen würde würde dies dasselbe machen wie TFanOverlayObject.items und das biete ich nicht an. Das was du wohl meinst ist FFanOvList.items[i] aber ich weiss gerade nicht ob die TObjectlist das anbietet. und wenn ja währe meine lösung dasselbe aus meiner sicht.
|
AW: TObjectList problem...
Mit dem Debugger bist Du bestimmt schon drübergegangen, ich vermute der Fehler kommt irgendwo außerhalb Deiner Schleifen zustande.
|
AW: TObjectList problem...
das vermute ich auch aber ich weiss nicht wo suchen. Ich versuche es noch einmal zu erklären
Ich hab mir ne Watch gemacht auf TVoltOverlayObject(FVoltOVList[1]) diese Watch habe ich beobachtet beim Debuggen. diese watch ist okey bis zum step ( 1. zu 2. komentare) und das wenn i = 8 ist. Also in dem moment wo er einen durchlauf beendet hat und wieder hochspringt zur bedingung gehen meine Objekte flöten. wieso auch immer und ich wüsste nicht was mir da genau einen strich durch die rechnung macht. Hast du eine ahnung was in dieser zeit noch passiert?
Delphi-Quellcode:
var
TempObject: TTempOverlayObject; FanObject: TFanOverlayObject; VoltObject: TVoltOverlayObject; i: Integer; ResultRecord: TResultIntRecord; MyTobject: TObject; begin Result:= GPReadSpeedFan.ReadSFData; ResultRecord:= GPReadSpeedFan.GetResultRecord; For i:= 0 to FTempOvList.Count -1 do begin TempObject:= FTempOvList[i] as TTempOverlayObject; TempObject.Temp:= ResultRecord.Temps[TempObject.TempArrayPos] div 100; If TempObject.IdleTemp > TempObject.Temp then TempObject.IdleTemp:= TempObject.Temp else If TempObject.LoadTemp < TempObject.Temp then TempObject.LoadTemp:= TempObject.Temp; end; For i:= 0 to FFanOvList.Count -1 do begin// <---------2. objekte sind flöten und i = 9 FanObject:= FFanOvList[i] as TFanOverlayObject; FanObject.RPM:= ResultRecord.fans[FanObject.RPMArrayPos]; FanObject.NewSpeed := GetNewSpeedForAFan(FanObject); If FanObject.IdleRPM > FanObject.RPM then FanObject.IdleRPM:= FanObject.RPM else If FanObject.LoadRPM < FanObject.RPM then FanObject.LoadRPM:= FanObject.RPM; end; // <------------ 1. hier stand i= 8 und meine objekte in der liste weiter unten sind noch richtig. anschliessend wieder einen step im debuger for i := 0 to FVoltOvList.Count - 1 do begin MyTobject:= FVoltOVList[i]; if FVoltOvList[i] is TVoltOverlayObject then VoltObject:= FVoltOvList[i] as TVoltOverlayObject ; VoltObject.Voltage:= ResultRecord.Volts[VoltObject.VoltArrayPos]/100 ; //FormatFloat('###0.0##',ResultRecord.Volts[VoltObject.VoltArrayPos]/100) If VoltObject.IdleVolt > VoltObject.Voltage then VoltObject.IdleVolt:= VoltObject.Voltage else If VoltObject.LoadVolt < VoltObject.Voltage then VoltObject.LoadVolt:= VoltObject.Voltage; end; |
AW: TObjectList problem...
Kann es sein daß Dir beim lesen von ResultRecord der Stack kaputtgeschrieben wird?
Pack ResultRecord: TResultIntRecord; mal testweise in eine globale Variable. |
AW: TObjectList problem...
was sollte dann passieren?
also funzen tuts nicht wenn ich das mache.... was aber ist das problem tritt nicht immer von 8-9 auf kann auch von 3-4 oder von 4-5 oder garnicht O.ô hatte vorhin einen fall da hat alles sauber funktioniert... für 2 mal und dann wieder kapput. |
AW: TObjectList problem...
Da ich einen Stackfehler vermute würde ich zu Eingrenzungszwecken, den kompletten Var-Teil bis auf i in einen globalen Speicherbereich umziehen, aber wirklich helfen kann ich Dir von hier aus nicht ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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-2025 by Thomas Breitkreuz