AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Pointer auf Record aus Funktion freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer auf Record aus Funktion freigeben

Ein Thema von Sko · begonnen am 30. Aug 2006 · letzter Beitrag vom 31. Aug 2006
Antwort Antwort
Seite 2 von 3     12 3      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:09
Moin Sko,

ich würde den Timer zu Beginn der OnTimer-Routine ab-, und nach der Abarbeitung wieder einschalten. (so ähnlich hab' ich das heute doch schon 'mal geschrieben )

Delphi-Quellcode:
begin
  PopupTimer.Enabled := false;
  try
    // hier der eigentliche Code für die OnTimer Routine
  finally
    PopupTimer.Enabled := true;
  end;
end;
Damit verhinderst Du, dass die Routine erneut aufgerufen wird, bevor sie abgearbeitet wurde.
Es könnte gut sein, dass die Routine länger als eine Sekunde braucht...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:15
Danke, aber das geht auch nicht, immernoch das gleiche, 4 Byte pro Sekunde mehr.
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:18
Mion Sko,

Du könntest es auch mal mit Bei Google suchenMemProof versuchen.
Das Programm ist darauf spezialisiert die Ursachen von Speicherlecks zu entdecken.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:23
du erzeugst mit
with TPopupForm.Create(Application) do bei jedem aufruf des Timerevents ein neues Formular. Gibst du das irgendwo wieder frei?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:31
@SirThornberry: er gibt das neue Formular wieder frei in einem Timer von dem neuen Formular. Ich habe das eben mal getestet und es funktioniert wirklich korrekt, sprich der Speicher wird richtig freigegeben.

Die ursache für die 4 Byte liegt in diesem Aufruf:
with TPopupForm.Create(Application) do ändere diesen mal folgend:
with TPopupForm.Create(nil) do denn so muss nicht jedesmal die referenz von 4 Byte gespeichert werden, du gibts diese form ja schließlich selbst frei.

mfg
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:45
Versuch doch mal statt einem Free ein close

und im OnClose musst du Action=cafree angeben.

Delphi-Quellcode:
procedure TPopupForm.FormClose(Sender:TObject;var Action:TCloseAction);
begin
  action=cafree;
end;
Und die Info von C.Seehase die OnTimer-Routine ab-, einschalten ist m.E. nach auch sehr wichtig.


Gerd
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:52
Es geht immernoch nicht, ich hab auch zum testen mal den Teil vom PopupForm erzeugen ausgeklammert, es wird immernoch mehr. Dann kann es nur noch in dem liegen was übrig bleibt, und das sieht so aus:
Delphi-Quellcode:
procedure TMainForm.PopupTimerTimer(Sender: TObject);
var
  IDs : Array[0..1023] of Integer;
  Records : Integer;
  i: integer;
  PopupForm: TPopupForm;
  PlayerInfo: TtsrPlayerInfo;
begin
  Records := 1024;
  if tsrGetSpeakers( @IDs, @records) <> 0 then exit;
  if Records > 0 then
  for i :=0 to Records-1 do
  begin
    tsrGetPlayerInfoByID(IDs[i], @PlayerInfo);
    {with TPopupForm.Create(nil) do
    begin
      LName.Caption := PlayerInfo.NickName + '  ';
      Top := round(Screen.DesktopHeight/2) - (19*(i + 1));
      Left := Screen.DesktopWidth - 125;
      FormStyle := fsStayOnTop;
      Show;
    end; }

  end;
end;
Ich glaube das mit den Pointern was nicht stimmt, allerdings krieg ich (trotz nachschlagen im Pointer-Tut) nicht raus was.
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 22:57
Zitat von Sko:
Es geht immernoch nicht, ich hab auch zum testen mal den Teil vom PopupForm erzeugen ausgeklammert, es wird immernoch mehr. Dann kann es nur noch in dem liegen was übrig bleibt, und das sieht so aus:
Delphi-Quellcode:
procedure TMainForm.PopupTimerTimer(Sender: TObject);
var
  IDs : Array[0..1023] of Integer;
  Records : Integer;
  i: integer;
  PopupForm: TPopupForm;
  PlayerInfo: TtsrPlayerInfo;
begin
  Records := 1024;
  if tsrGetSpeakers( @IDs, @records) <> 0 then exit;
  if Records > 0 then
  for i :=0 to Records-1 do
  begin
    tsrGetPlayerInfoByID(IDs[i], @PlayerInfo);
    {with TPopupForm.Create(nil) do
    begin
      LName.Caption := PlayerInfo.NickName + '  ';
      Top := round(Screen.DesktopHeight/2) - (19*(i + 1));
      Left := Screen.DesktopWidth - 125;
      FormStyle := fsStayOnTop;
      Show;
    end; }

  end;
end;
Ich glaube das mit den Pointern was nicht stimmt, allerdings krieg ich (trotz nachschlagen im Pointer-Tut) nicht raus was.

Dann kann es eigenslich nur noch an den Functionen tsrGetPlayerInfoByID oder tsrGetPlayerInfoByID liegen. Oder?

Gerd
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#19

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 23:01
Zitat von Christian Seehase:
Damit verhinderst Du, dass die Routine erneut aufgerufen wird, bevor sie abgearbeitet wurde.
Kann sie gar nicht, da der VCL-Timer auf Windows-Botschaften und nicht auf Threads basiert (nicht jede Klassenbibliothek hat 3 verschiedene Timer ^^ ).

@Sko: Der Fehler kann wirklich überall liegen, deswegen schließe ich mich Christian Seehase an, versuch es mal mit MemCheck/MemProof. Aber wie hast du es geschafft, dass dein Taskmanager einzelne Bytes anzeigt ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Pointer auf Record aus Funktion freigeben

  Alt 30. Aug 2006, 23:07
Ja, das sind Funktionen die einen Pointer auf einen Record als Parameter bekommen und diesen Record dann mit den Daten füllen, in der Import-Unit sieht das so aus:
Delphi-Quellcode:
//##############################################################################
//#
//# Function tsrGetSpeakers( IDs : PInteger; RecordCount: PInteger): Integer;
//#
//# Description:
//# Get ID list of people that are speaking now
//#
//# Input:
//# IDs: Buffer to hold atleast RecordCount Integers
//# RecordCount: How much Integers IDs can hold
//#
//# Output:
//# Result: 0 = OK, else the error number
//# if result = 0 then
//# IDs: Buffer to RecordCount* Ids of people who are talking
//# RecordCount: How Much people are talking
//#
//##############################################################################
Type TtsrGetSpeakers = Function ( IDs : PInteger; RecordCount: PInteger): Integer;
                 {$ifdef linux}cdecl;{$endif} {$ifdef mswindows}stdcall;{$endif}
var tsrGetSpeakers : TtsrGetSpeakers;
Const fn_tsrGetSpeakers='tsrGetSpeakers';
//##############################################################################
//#
//# Function tsrGetPlayerInfoByID( PlayerID: Integer;
//# tsrPlayerInfo : PtsrPlayerInfo): Integer;
//#
//# Description:
//# Get the Info on the player specified by PlayerID.
//#
//# Input:
//# PlayerID: The ID of the player you want the info from
//# tsrPlayerInfo: This is the pointer to a TtsrPlayerInfo record
//#
//# Output:
//# Result: 0 = OK, else the error number
//# if result = 0 then tsrPlayerInfo is filled with the player info.
//#
//##############################################################################
type TtsrGetPlayerInfoByID = Function ( PlayerID: Integer; tsrPlayerInfo : PtsrPlayerInfo): Integer;
                 {$ifdef linux}cdecl;{$endif} {$ifdef mswindows}stdcall;{$endif}
var tsrGetPlayerInfoByID : TtsrGetPlayerInfoByID;
Const fn_tsrGetPlayerInfoByID='tsrGetPlayerInfoByID';
So sieht der Records aus:
Delphi-Quellcode:
Type

  PtsrPlayerInfo = ^TtsrPlayerInfo;
  TtsrPlayerInfo = packed record
    PlayerID : Integer;
    ChannelID : Integer;
    NickName : Array [0..29] of Char;
    PlayerChannelPrivileges : Integer;
    PlayerPrivileges : Integer;
    PlayerFlags : Integer;
  end;
Zitat von Khabarakh:
Aber wie hast du es geschafft, dass dein Taskmanager einzelne Bytes anzeigt ... ?
Ach verdammt, das sind ja Kilobyte...peinlich
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 05:30 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