AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList problem...

Ein Thema von gibb · begonnen am 23. Dez 2010 · letzter Beitrag vom 24. Dez 2010
Antwort Antwort
Seite 1 von 3  1 23      
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#1

TObjectList problem...

  Alt 23. Dez 2010, 09:10
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:
  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;
hat jemand eine idee woran das liegen könnte?

Gruss Sev
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: TObjectList problem...

  Alt 23. Dez 2010, 09:30
wie spielt ResultRecord da mit?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#3

AW: TObjectList problem...

  Alt 23. Dez 2010, 09:41
Das ist folgender record
Code:
  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;
er beinhaltet die Daten die ich auslese das auslesen passiert hier:

Code:
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;
Der wird vor den 2 loops aufgerufen.

Code:
  Result:= GPReadSpeedFan.ReadSFData;
  ResultRecord:= GPReadSpeedFan.GetResultRecord;
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TObjectList problem...

  Alt 23. Dez 2010, 10:16
Code:
  For i:= 0 to FFanOvList.Count -1 do begin
    FanObject:= FFanOvList[i] as TFanOverlayObject;
...
hat jemand eine idee woran das liegen könnte?
Gruss Sev
ist das nicht eher

FanObject:= FFanOvList[i].Items as TFanOverlayObject; ?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#5

AW: TObjectList problem...

  Alt 23. Dez 2010, 10:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: TObjectList problem...

  Alt 23. Dez 2010, 10:30
Mit dem Debugger bist Du bestimmt schon drübergegangen, ich vermute der Fehler kommt irgendwo außerhalb Deiner Schleifen zustande.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#7

AW: TObjectList problem...

  Alt 23. Dez 2010, 10:48
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;
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#8

AW: TObjectList problem...

  Alt 23. Dez 2010, 11:01
Kann es sein daß Dir beim lesen von ResultRecord der Stack kaputtgeschrieben wird?
Pack ResultRecord: TResultIntRecord; mal testweise in eine globale Variable.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
gibb

Registriert seit: 12. Sep 2007
Ort: Bern
178 Beiträge
 
Delphi 2006 Architect
 
#9

AW: TObjectList problem...

  Alt 23. Dez 2010, 11:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: TObjectList problem...

  Alt 23. Dez 2010, 11:24
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 ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz