Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wo kann ich den Timer Free'en ? (https://www.delphipraxis.net/16184-wo-kann-ich-den-timer-freeen.html)

Pseudemys Nelsoni 12. Feb 2004 06:12


Wo kann ich den Timer Free'en ?
 
hallo

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  timer: TTimer;
begin
  SetLength(clients, length(clients)+1);
  clients[high(clients)] := Socket.RemoteAddress;
  timer := TTimer.Create(nil);
  with timer do
  begin
    Interval := 30000;
    OnTimer := TimerEvent;
    enabled := true;
  end;
  listbox1.Items.Add(socket.LocalAddress);
end;

procedure TForm1.TimerEvent(Sender: TObject);
begin
  ServerSocket1.Socket.Connections[0].Close;
  // hier müsste ich ihn frei machen. Sender.free; ?
end;
hat jemand ne idee wie ich den zur laufzeit erzeugten timer wieder aus dem speicher bekomme?

Luckie 12. Feb 2004 06:15

Re: Wo kann ich den Timer Free'en ?
 
Mach in global. Aber warum erzeugst du ihn nicht zur Design-Zeit und aktiveirst / deaktivierst ihn nur bei Bedarf?

Pseudemys Nelsoni 12. Feb 2004 06:21

Re: Wo kann ich den Timer Free'en ?
 
hoi,

ich brauche beliebig viele timer, je nachdem wieviele clients auf dem server sind, die sollen nach 30 sekunden wieder getrennt werden, glaube mit global definieren geht das nicht oder? ich weiss ja die anzahl nicht

Luckie 12. Feb 2004 06:26

Re: Wo kann ich den Timer Free'en ?
 
Was spricht gegen ein array of TTimer. Hast du doch auch gerade mit den Clients gemacht.

Aber mal was anders. Überdenk dein Konzept noch mal. Wie wäre es mit sowas:
Delphi-Quellcode:
type
  TClient = record
    Name: String;
    Timer: TTimer;
    ...;
    ...;
  end;
end;

[..]

var
  ClientArray: array of TClient;

Pseudemys Nelsoni 12. Feb 2004 06:28

Re: Wo kann ich den Timer Free'en ?
 
dagegenspricht nichts, ist eine gute Idee, danke :wink:

Luckie 12. Feb 2004 06:30

Re: Wo kann ich den Timer Free'en ?
 
Zitat:

Zitat von Pseudemys Nelsoni
dagegenspricht nichts, ist eine gute Idee, danke :wink:

Gegen das array of TTimer oder gegen den Record? Eventuell sollte man das auch gleich alles in eine Klasse packen. Denn die Methoden zum Verbinden, Senden, empfangen, Trennen sind ja mit den daten TClient verbunden. Wäre also prädestiniert für eine Klasse. ;)

Pseudemys Nelsoni 12. Feb 2004 07:00

Re: Wo kann ich den Timer Free'en ?
 
Zitat:

Gegen das array of TTimer oder gegen den Record?
gegen beides, habe nicht daran gedacht einen array of TTimer zu benutzen und ihn auch in einem record zusammenzufassen^^

Mit Klassen hab ich noch nicht gearbeitet, wird wohl auch noch dauern :)



btw: Ist das mit den timern nicht "gefährlich" ?

Sagen wir mal die Timer arbeiten so:

Timer1:

begin
//irgendwas tuen
//irgendwas tuen
//irgendwas tuen
//Lösche Element 0 des dynamischen Arrays
end;


Timer2:

begin
//irgendwas tuen
//Lösche Element 0 des dynamischen Arrays
end;


Was ist wenn Timer1 startet, und Timer2 0,1sek später, wenn Timer2 nun eher fertig ist als Timer1 wird ein ganz anderes element gelöscht als das element in dem der timer selbst ist. Gibts da irgendwie ne lösung?

Chewie 12. Feb 2004 11:04

Re: Wo kann ich den Timer Free'en ?
 
Zitat:

Zitat von Pseudemys Nelsoni
Was ist wenn Timer1 startet, und Timer2 0,1sek später, wenn Timer2 nun eher fertig ist als Timer1 wird ein ganz anderes element gelöscht als das element in dem der timer selbst ist. Gibts da irgendwie ne lösung?

Das kann meines Wissens eigentlich nicht passieren. Die Behandlung eines Timerevents findet statt, sobald ein entsprechendes WM_TIMER-Event in der Nachrichtenschleife des Programmes auftaucht. Nun wird dieses Ereignis behandelt, sprich deine OnTimer-Routine ausgeführt. Erst wen diese fertig ist, wird das nächste Event aus der Nachrichtenschelife geholt.
Ein Problem gibt es dann nur, wenn du Application.ProcessMessages in deinem Timer-Event aufrufst: Denn dieser Aufruf bewirkt, dass ausstehende Nachrichten abgearbeitet werden, also werden evtl. auch die Behandlungsroutinen anderer Timer aufgerufen.

Vjay 12. Feb 2004 11:54

Re: Wo kann ich den Timer Free'en ?
 
Da hat Chewie absolut recht, allerdings bei deinem massiven Timergebrauch solltest du dich mal mit SetTimer und KillTimer beschäftigen, dann brauchst du keine Objekte erzeugen und freen. Sparrt ausserdem Prozessorzeit und Ressourcen.

MfG

Pseudemys Nelsoni 12. Feb 2004 15:05

Re: Wo kann ich den Timer Free'en ?
 
Hallo,

ich dachte Timer arbeiten wie Threat's. SetTimer, Killtimer? wie reagiere ich da auf timer events? mal in der hilgfe gucken, hoffentlich steht da was.


btw:

Delphi-Quellcode:
type
  TClientInfo = record
    Address: string;
    Timer: TTimer;
  end;

...

var
  Form1: TForm1;
  ClientInfo: Array of TClientInfo;

...

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  timer: TTimer;
begin
  SetLength(ClientInfo, length(ClientInfo)+1);
  ClientInfo[high(ClientInfo)].Address := Socket.RemoteAddress;
  timer := TTimer.Create(nil);
  with timer do
  begin
    Interval := 30000;
    OnTimer := TimerEvent;
    enabled := true;
  end;
  listbox1.Items.Add(Socket.RemoteAddress);
end;

procedure TForm1.TimerEvent(Sender: TObject);
var
  i: integer;
begin
  ServerSocket1.Socket.Connections[0].Close;
  ClientInfo[0].Timer.Free;
  for i := 0 to high(ClientInfo)-1 do
    ClientInfo[i] := ClientInfo[i+1];
  SetLength(ClientInfo, high(ClientInfo)-1);
end;

wenn ich jetzt z.b mit dem IE 2mal zur gleichen zeit meine ip + port aufrufe, stehen 2 ips (meine) in der listbox, also funktioniert noch alles normal, aber wenn das ontimer event auftritt krieg ich eine zugriffsverletzung, aber wieso?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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