![]() |
Pointer auf Record aus Funktion freigeben
Hallo,
ich bastel grad sowas wie ![]() Also hab ich einen Timer in mein Programm gebaut der jede Sekunde prüft ob jemand spricht. Allerdings kann ich im Tastmanager sehen das das Programm jede Sekunde 4 Bytes mehr Speicher benutzt. Ich glaub das das an der Funktion liegt, die die Daten über den Benutzer ausliest. Hier mal meine Timer-Prozedur:
Delphi-Quellcode:
TtsrPlayerInfo ist ein packed record und sieht so aus:
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); //<-liest Bemutzerinfos aus with TPopupForm.Create(Application) do begin LName.Caption := PlayerInfo.NickName; Top := round(Screen.DesktopHeight/2) - (19*(i + 1)); Left := Screen.DesktopWidth - 150; FormStyle := fsStayOnTop; Show; end; end; end; //Beschreibung von tsrGetPlayerInfoByID aus der Unit TsRemoteImport: //############################################################################## //# //# 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. //# //##############################################################################
Delphi-Quellcode:
Wie kann ich verhindern das jede Sekunde neuer Speicher belegt wird?
TtsrPlayerInfo = packed record
PlayerID : Integer; ChannelID : Integer; NickName : Array [0..29] of Char; PlayerChannelPrivileges : Integer; PlayerPrivileges : Integer; PlayerFlags : Integer; end; Ich hoffe ihr könnt mir helfen. |
Re: Pointer...mal wieder
Delphi-Quellcode:
Der Teil hier wird nicht freigegeben. :)
with TPopupForm.Create(Application) do
Delphi-Quellcode:
with TPopupForm.Create(Application) do
... Free; |
Re: Pointer...mal wieder
Oh, das hab ich vergessen zu erwähnen, auf PopupForm ist ein Timer der sie wieder freigibt
Delphi-Quellcode:
Und in einer anderen Prozedur, die ebenfalls eine ähnliche Funktion verwendet, habe ich das gleiche Problem.
unit Popup;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TPopupForm = class(TForm) LName: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var PopupForm: TPopupForm; implementation {$R *.dfm} procedure TPopupForm.Timer1Timer(Sender: TObject); begin Self.Free; end; end. |
Re: Pointer...mal wieder
Zeig mal mehr Code, vor allem die Variablen-Deklaration.
Wenn du mit dem code aus Post #1 eine Instanz der Klasse erstellst, kannst du die nicht per Timer freigeben. Es gibt die Instanz ausserhalb der Prozedur nicht. |
Re: Pointer...mal wieder
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hier mal komplett:
HauptFenster
Delphi-Quellcode:
Und die Import-Unit für die DLL ist im Anhang.
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, XPMan, TSRemoteImport, ExtCtrls, JvComponent, JvTrayIcon; type TMainForm = class(TForm) XPManifest1: TXPManifest; GroupBox1: TGroupBox; LStatus: TLabel; Button1: TButton; Button2: TButton; GroupBox2: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; LIP: TLabel; LChannels: TLabel; LUser: TLabel; LProgStatus: TLabel; GroupBox3: TGroupBox; LAktChannel: TLabel; Label4: TLabel; Label5: TLabel; LAnzUserChannel: TLabel; Label6: TLabel; LCodec: TLabel; Tray: TJvTrayIcon; Label7: TLabel; LNick: TLabel; PopupTimer: TTimer; Label8: TLabel; LserverName: TLabel; Label9: TLabel; LServerLabel: TLabel; Label10: TLabel; LMaxUser: TLabel; Button3: TButton; procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure PopupTimerTimer(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var MainForm: TMainForm; implementation uses Popup; {$R *.dfm} Function DisplayResult( Res: Integer ) : Boolean; Var ErrorMessage: array[0..1023] of Char; begin if res=0 then Result := True else begin tsrGetLastError(@ErrorMessage, SizeOf(ErrorMessage)); ShowMessage(ErrorMessage); Result := False; end; end; procedure TMainForm.FormCreate(Sender: TObject); begin LProgStatus.Caption := 'Initialisiere Remote-Lib...'; case InitTSRemoteLibrary(true) of 0 : LProgStatus.Caption := 'Remote-Lib geladen'; -1: LProgStatus.Caption := 'Remote-Lib bereits initialisiert'; -2: LProgStatus.Caption := 'Fehler beim Laden der Remote-Lib'; -3: LProgStatus.Caption := 'interner Funktionsfehler'; end; end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CloseTsRemoteLibrary; end; 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(Application) do begin LName.Caption := PlayerInfo.NickName; Top := round(Screen.DesktopHeight/2) - (19*(i + 1)); Left := Screen.DesktopWidth - 150; FormStyle := fsStayOnTop; Show; end; end; end; procedure TMainForm.Button2Click(Sender: TObject); //<--hier gibts das gleiche Problem, allerdings wird hier keine Form erstellt var ServerInfo: TtsrServerInfo; UserInfo: TtsrUserInfo; begin if tsrGetServerInfo(@ServerInfo) <> 0 then begin LStatus.Caption := 'nicht verbunden'; LStatus.Font.Color := clblack; LIP.Caption := '-'; LServerName.Caption := '-'; LChannels.Caption := '-'; LUser.Caption := '-'; exit; end else begin LStatus.Caption := 'verbunden'; LStatus.Font.Color := clgreen; LIP.Caption := ServerInfo.ServerIp; LServerName.Caption := ServerInfo.ServerName; LServerLabel.Caption := ServerInfo.ServerPlatform; LChannels.Caption := IntToStr(ServerInfo.ChannelCount); LUser.Caption := IntToStr(ServerInfo.PlayerCount); LMaxUser.Caption := IntToStr(ServerInfo.ServerMaxUsers); end; if tsrGetUserInfo(@UserInfo) <> 0 then begin LNick.Caption := '-'; LAktChannel.Caption := '-'; LAnzUserChannel.Caption := '-'; LCodec.Caption := '-'; exit; end else begin LNick.Caption := UserInfo.Player.NickName; LAktChannel.Caption := UserInfo.Channel.Name; LAnzUserChannel.Caption := IntToStr(UserInfo.Channel.PlayerCountInChannel); case UserInfo.Channel.Codec of 0: LCodec.Caption := 'CELP 5.1 Kbit'; 1: LCodec.Caption := 'CELP 6.4 Kbit'; 2: LCodec.Caption := 'GSM 14.8 Kbit'; 3: LCodec.Caption := 'GSM 16.4 Kbit'; 4: LCodec.Caption := 'CELP Windows 5.2 Kbit'; 5: LCodec.Caption := 'Speex 3.4 Kbit'; 6: LCodec.Caption := 'Speex 5.2 Kbit'; 7: LCodec.Caption := 'Speex 7.2 Kbit'; 8: LCodec.Caption := 'Speex 9.3 Kbit'; 9: LCodec.Caption := 'Speex 12.3 Kbit'; 10: LCodec.Caption := 'Speex 16.3 Kbit'; 11: LCodec.Caption := 'Speex 19.5 Kbit'; 12: LCodec.Caption := 'Speex 25.9 Kbit'; end; end; end; procedure TMainForm.Button3Click(Sender: TObject); begin if Button3.Caption = 'Aktivieren' then begin PopupTimer.Enabled := true; Button3.Caption := 'Deaktivieren'; end else begin PopupTimer.Enabled := false; Button3.Caption := 'Aktivieren'; end; end; end. |
Re: Pointer...mal wieder
Zitat:
Gruß Michael |
Re: Pointer...mal wieder
Ja, der Timer ist ja auf dem erstellten Formular und gibt dieses mit Self.Free frei. Oder geht das so nicht?
|
Re: Pointer...mal wieder
@Sko: Könntest du bitte dem Beitrag einen aussagekräftigen Titel geben so wie es auch in den Verhaltensregeln der DP steht denen du bei der Anmeldung zugestimmt hast. Dein Betreff deutet lediglich an das es in fernster Weise um Pointer geht und da kann es um Objecte, Listen, dynamiches Anfordern von Speicher, dereferenzieren etc. gehen. Der Titel sagt also so gut wie nichts aus.
|
Re: Pointer auf Record aus Funktion freigeben
Entschuldigung :oops: . Ich habs versucht zu ändern, allerdings weis ich nicht so richtig wie ich´s ausdrücken sollte.
Ich weis das der Speicherzuwachs von den folgenden Funktionen kommt:
Delphi-Quellcode:
Allerdings kann ich diese Pointer nicht einfach freigeben, da sie jede Sekunde gebraucht werden.
tsrGetPlayerInfoByID(IDs[i], @PlayerInfo);
tsrGetUserInfo(@UserInfo); tsrGetServerInfo(@ServerInfo); |
Re: Pointer auf Record aus Funktion freigeben
das du nicht genau weißt wie du es ausdrücken sollst ist ok/normal da du ja eben noch an der Lösung des Problems bist. Aber man sieht das du dir jetzt Gedanken gemacht hast und der Betreff deutet darauf hin worum es geht. Perfekt :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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