AGB  ·  Datenschutz  ·  Impressum  







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

Wo kann ich den Timer Free'en ?

Ein Thema von Pseudemys Nelsoni · begonnen am 12. Feb 2004 · letzter Beitrag vom 12. Feb 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:12
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?
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:15
Mach in global. Aber warum erzeugst du ihn nicht zur Design-Zeit und aktiveirst / deaktivierst ihn nur bei Bedarf?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:21
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
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:26
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:28
dagegenspricht nichts, ist eine gute Idee, danke
Mario
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 06:30
Zitat von Pseudemys Nelsoni:
dagegenspricht nichts, ist eine gute Idee, danke
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#7

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 07:00
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?
Mario
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 11:04
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#9

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 11:54
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
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#10

Re: Wo kann ich den Timer Free'en ?

  Alt 12. Feb 2004, 15:05
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?
Mario
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:28 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