![]() |
Re: Pointer auf Record aus Funktion freigeben
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 :gruebel: ;-))
Delphi-Quellcode:
Damit verhinderst Du, dass die Routine erneut aufgerufen wird, bevor sie abgearbeitet wurde.
begin
PopupTimer.Enabled := false; try // hier der eigentliche Code für die OnTimer Routine finally PopupTimer.Enabled := true; end; end; Es könnte gut sein, dass die Routine länger als eine Sekunde braucht... |
Re: Pointer auf Record aus Funktion freigeben
Danke, aber das geht auch nicht, immernoch das gleiche, 4 Byte pro Sekunde mehr.
|
Re: Pointer auf Record aus Funktion freigeben
Mion Sko,
Du könntest es auch mal mit ![]() Das Programm ist darauf spezialisiert die Ursachen von Speicherlecks zu entdecken. |
Re: Pointer auf Record aus Funktion freigeben
du erzeugst mit
Delphi-Quellcode:
bei jedem aufruf des Timerevents ein neues Formular. Gibst du das irgendwo wieder frei?
with TPopupForm.Create(Application) do
|
Re: Pointer auf Record aus Funktion freigeben
@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:
Delphi-Quellcode:
ändere diesen mal folgend:
with TPopupForm.Create(Application) do
Delphi-Quellcode:
denn so muss nicht jedesmal die referenz von 4 Byte gespeichert werden, du gibts diese form ja schließlich selbst frei.
with TPopupForm.Create(nil) do
mfg |
Re: Pointer auf Record aus Funktion freigeben
Versuch doch mal statt einem Free ein close
und im OnClose musst du Action=cafree angeben.
Delphi-Quellcode:
Und die Info von C.Seehase die OnTimer-Routine ab-, einschalten ist m.E. nach auch sehr wichtig.
procedure TPopupForm.FormClose(Sender:TObject;var Action:TCloseAction);
begin action=cafree; end; Gerd |
Re: Pointer auf Record aus Funktion freigeben
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:
Ich glaube das mit den Pointern was nicht stimmt, allerdings krieg ich (trotz nachschlagen im Pointer-Tut) nicht raus was.
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; |
Re: Pointer auf Record aus Funktion freigeben
Zitat:
Dann kann es eigenslich nur noch an den Functionen tsrGetPlayerInfoByID oder tsrGetPlayerInfoByID liegen. Oder? Gerd |
Re: Pointer auf Record aus Funktion freigeben
Zitat:
@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 :gruebel: ? |
Re: Pointer auf Record aus Funktion freigeben
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:
So sieht der Records aus:
//##############################################################################
//# //# 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';
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:12 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