begin process at 2013 05 25 04:26:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Mémoire

 > 

liberer proprement


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

liberer proprement

samedi 29 septembre 2012 à 09:25:14 | liberer proprement

simonpelloquin

Membre Club

Bonjour,

C'est encore moi...

J'ai créé une classe TDoubleSMS qui permet d'envoyer deux SMS à 8 secondes d'intervalle.
J'ai donc déclaré (en résumé) :
Code Delphi :
TDoubleSMS = Class(TComponent)
   Private
     FTimer : TTimer;
     procedure TimerExecute(sender: TObject);
   Public
     Constructor Create(aOwner : TComponent);
     Destructor Destroy;
end;


Sur le constructeur, j'envoie un premier SMS et je crée un timer pour le second:
Code Delphi :
FTimer := TTimer.Create(self);)
With FTimer do begin
     Interval := 8000;
     OnTimer  := TimerExecute;
     Enabled  := True;
end;


Sur le destructeur, idéalement, je voudrais libérer proprement le timer :
Code Delphi :
if FTimer <> nil
   then FTimer.Free;


Tout marche bien, mais... mon problème est que je ne parviens pas à appeler le destructeur à la fin du TimerExecute, i.e. après l'envoi du second SMS... (j'ai mis un point d'arrêt sur le destroy, et malheureusement il n'est jamais déclenché...)

J'ai essayé en appelant directement le destroy dans TimerExecute, mais ça ne fonctionne pas (en même temps, appeler un destroy dans une procedure de la classe, je ne trouve pas ça très joli...).

Je me demandais s'il y avait un moyen, en donnant à ma classe un indicateur (boolean ?, appelons le bTermine...) d'envoi du second SMS, de déclencher un événement qui appellerait le destroy. "bTermine" serait donc initialisé à false par le constructeur et valorisé à true après l'envoi du second SMS. L'événement "OnTermine" serait donc déclenché par le changement d'état de bTermine. Et c'est là où je bloque... J'ai essayé quelques trucs en observant des sources de composants, mais sans résultat... Auriez-vous une petite explication à me donner ? Un début de piste ? (ou une autre façon de faire ?)

Simon
samedi 29 septembre 2012 à 14:54:53 | Re : liberer proprement

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

première chose qui me "choque" c'est l'absence de surcharge des méthodes !!
cette absence empêche l'appel au constructeur/destructeur hérité.
Code Delphi :
...
   Public
     constructor Create(aOwner : TComponent); override;
     destructor Destroy; override;


et dans le code
Code Delphi :
constructor TDoubleSMS.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);// ne jamais oublier
  FTimer := TTimer.Create(self);
end;

destructor TDoubleSMS.Destroy;
begin
  if FTimer <> nil  // inutile ici
    then FTimer.Free;
  inherited Destroy;// ne jamais oublier
end;

mais comme tu utilise "Self" comme paramètre du Owner dans la création du Timer:
Code Delphi :
FTimer := TTimer.Create(self);

tu n'as pas besoin de te charger de le libérer ... le composant DoubleSMS s'en chargera au moment de sa propre destruction. Tu peux donc supprimer la déclaration et l'implémentation du destructeur.

est ce que ceci suffit à résoudre ton problème ?

@+Cirec
dimanche 30 septembre 2012 à 11:11:01 | Re : liberer proprement

simonpelloquin

Membre Club

Salut Cirec et merci pour ta réponse.

Oups, c'est vrai je vais rajouter la surcharge... Au début, je n'avais déclaré qu'une class, puis je l'ai "dérivée" de TComponent.
Je ne peux pas tester ça avant lundi. Pour te répondre (à savoir est-ce que ça suffit à résoudre mon problème), comment je libère le composant à partir du TimerExecute ? Un simple "free" dans cette procédure va t'il appeler le destructeur ? Parce que le composant est créé par mon programme, mais je voudrais qu'il se libère tout seul comme un grand après avoir fait son boulot... (de façon à ce que le programme (enfin, moi en fait ) n'ait pas à gérer ça.

Pour aller plus loin, et dans la mesure où je n'abuse pas de ton temps, est-ce que mon idée première (implémenter un événement sur un changement d'état d'une propriété du composant) est codable ?

Simon
lundi 1 octobre 2012 à 09:50:00 | Re : liberer proprement

simonpelloquin

Membre Club

Bon, ça marche. L'absence de surcharge de méthode y était pour quelque chose...

Question complémentaire, j'ai codé la libération du compo de deux façons :
1) un "Self.Free;" à la fin du TimerExecute

2) gestion par un événement :
Code Delphi :
  TDoubleSMS = class(TComponent)
     private
            FTermine : TNotifyEvent;
            FTimer : TTimer;
            procedure TimerSecondMessage(Sender : TObject);
            procedure Termine(Sender : TObject);

     public
           constructor Create (Aowner: TComponent); override;
           Destructor Destroy; override;
           property OnFinish : TNotifyEvent read FTermine write FTermine;
end;

procedure TDoubleSMS.Termine(Sender : TObject);
begin
     Free;
end;

procedure TDoubleSMS.TimerSecondMessage(Sender: TObject);
begin
     // bla bla bla
     if Assigned(FTermine)
        then FTermine(Self);
end;


Les deux façons fonctionnent, mais y en a t'il une de meilleure ?

Simon
lundi 1 octobre 2012 à 09:51:21 | Re : liberer proprement

simonpelloquin

Membre Club
ah j'ai oublié, dans le constructor :

OnFinish := Termine;


Simon
mardi 2 octobre 2012 à 20:19:57 | Re : liberer proprement

cirec

Membre Club Administrateur CodeS-SourceS
re,

je n'ai jamais eu besoin d'un composant qui se détruit lui même ... mais l'aide de Delphi dit ceci:

Ne libérez jamais explicitement un composant dans un de ses propres gestionnaires d'événement ou dans un gestionnaire d'événement d'un composant qu'il possède ou contient.



donc du coup je pencherai plus pour TThread qui lui est prévu pour s'autodétruire en fin d'exécution en mettant
Code Delphi :
FreeOnTerminate := True;





@+Cirec


Cette discussion est classée dans : code, sms, destroy, ftimer, timerexecute


Répondre à ce message

Sujets en rapport avec ce message

urgent : code à corriger. Cela fait des jours que je suis dessus !!!!!! [ par Marcel ] Le code qui suit sert à créer un compte à rebours. Les 2 dernières lignes de ce code sont incorrecte car le compilateur signale:[Erreur]Unit1.pas(56): MessageBox_HiA [ par DelphiCool ] HelloSi quelqu'un à envie de l'essayerc'est un Soft qui creer le code Delphi pour les MessageBoxIl est Visuel, vous tester votre MessageBox avant de c Probleme ListView [ par Shadow ] Quand je mets ce code là et que je l execute il me dit erreur !code :varlist:TlistItem;beginif list.Caption = 'Quitter' then main.Close; Pb fermeture d'une appli ouverte à partir d'une autre [ par Sandrine ] Bonjour,J'ai une application qui possède un bouton permettant d'ouvrir une deuxième application (qui ne possède qu'une fenêtre affichant du texte cont Couleur [ par Shadow ] Salut, je voudrai mettre une couleur comme fond sur ma form mais la couleur c un code html alors je veux savoir si je peux utiliser un code html ?moi Code ASCII -> Son caractère correspondant [ par Fabiin ] Salut !Quel fonction permet de passer du code ASCII en sont caractère correspondnat ???l'inverse de Ord()Merci par avance@+Fabs algorithme genetique code source [ par nana ] je cherche le code source et le programme d'un algorithme génétique pour le problème de TSP ( de préférence en pascal, delphi, fortran sinon autres la Code à rallonge [ par Teardrop ] Bonjour,Voici mon probleme (en esperant etre au bon forum pour ca :)considérons que j'ai 10 CheckBox sur une fiche, chacune correspond a une valeur da erreur et encore erreur!!! Helpppppp [ par glopglop ] Salut! Dans le code je creer diverse DXimage, DXLabel...j'ai un bouton sur le DXdraw qui me permet de reinitialiser le tout: je fais une destruction d erreur de pile et violation d'acces [ par glopglop ] Salut! Dans le code je creer diverse DXimage, DXLabel...j'ai un bouton sur le DXdraw qui me permet de reinitialiser le tout: je fais une destruction d


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales