Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3028 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  TTimer et destruction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

TTimer et destruction

n°922980
Nico SIA
Posté le 14-12-2004 à 16:12:46  profilanswer
 

Hello,
 
Encore un petit soucis. Il semblerait que lorsque qu'un TTImer est detruit, l'event onTimer qui a pu etre empile dans les messgaes windows soit depile apres l'appel au Free du TTimer. Du coup, on se retrouve avec une exception avec un read adress a 0000000. QQun a deja eu des problemes avec les TTImer et la destruction de ces objects ?
 
Merci,

mood
Publicité
Posté le 14-12-2004 à 16:12:46  profilanswer
 

n°923025
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 16:44:59  profilanswer
 

Bizarre :??:  
Si c'était ça je m'attendrais justement à une adresse autre que 0000000, vu que 000000 indique un pointeur nil.
 
Tu peux toujours désactiver le Timer puis faire un Application.ProcessMessages juste avant sa destruction, pour être sûr qu'il n'y ait pas un appel en attente dans les messages.


Message édité par antp le 14-12-2004 à 16:45:18

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°923032
Nico SIA
Posté le 14-12-2004 à 16:51:15  profilanswer
 

Deja essaye mais c'est pareil :(

n°923036
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 16:56:17  profilanswer
 

Le bug est peut-être ailleurs alors... Tu ne détruis pas par hasard un objet dans un de ses événements ? Il n'indique pas à quel endroit du code arrive cet accès mémoire interdit ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°923084
Nico SIA
Posté le 14-12-2004 à 17:21:20  profilanswer
 

Voila le code execute:
  if (FT3Timer <> nil) then
  begin
    FT3Timer.Enabled:=False;
    FT3Timer.OnTimer:=nil;
    Application.ProcessMessages;
    FT3Timer.Free;
    FT3Timer := nil;
  end;
 
C'est la dedand que j'ai une exception ;)

n°923100
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 17:36:24  profilanswer
 

et ce code il se trouve où ? pas dans le OnTimer quand même ? :D
(t'as une exception sur quelle ligne ?)


Message édité par antp le 14-12-2004 à 17:36:59

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°923118
Nico SIA
Posté le 14-12-2004 à 17:48:39  profilanswer
 

Rigole pas si vite, ce code est dans une fonction (ce sont les seules lignes) qui est appele ds le ontimer !!
Sinon, je ne sais pas a quelle ligne cela arrive et comme l'exception est super chaude a reproduire ...

n°923123
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 17:50:30  profilanswer
 

Bah c'est normal que ça plante alors :
 
on est dans une fonction Z du TTimer
déclanchement du ontimer
appel de ta fonction
destruction du timer
fin de ta fonction
retour dans le code de la fonction Z du TTimer... boum : on arrive dans un truc qui a été liquidé entre temps
 
Les fois où ça ne plante pas c'est quand, par chance, la zone mémoire du TTimer et tout ce qui y est relié est restée intacte bien que l'objet ait été supprimé.


Message édité par antp le 14-12-2004 à 17:51:38

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°923124
Nico SIA
Posté le 14-12-2004 à 17:50:51  profilanswer
 

Mais bon, ds le cas d'aujourd'hui, il a ete appele de l'exterieur ;)

n°923127
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 17:52:15  profilanswer
 

D'où ? À quel moment c'est appelé ? Le timer a été construit comment ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 14-12-2004 à 17:52:15  profilanswer
 

n°923138
Nico SIA
Posté le 14-12-2004 à 18:08:58  profilanswer
 

Bon, la ca devient un peu complique pour tout expliquer :p
Ce timer est associe a un objet propre a notre soft:Transaction. Lors de l'envoi de la transaction, on va creer ce timer en executant cette fonction:
 
procedure TswSecsTransaction.SetT3Timer(Time : Integer);
begin
  KillT3Timer;
  if Time>0 then
  begin
    FT3Timer:=TTimer.Create(nil);
    FT3Timer.Enabled:=False;
    FT3Timer.OnTimer:=self.T3TimerOnTimer;
    FT3Timer.Interval:=Time;
    FT3Timer.Enabled:=True;
  end;
end;
 
Ensuite, lorsqu'on recoit la reponse a notre transaction (donc avant ce timer de timeout), on detruit le timer avec le code :
 
procedure TswSecsTransaction.KillT3Timer;
begin
  if (FT3Timer <> nil) then
  begin
    FT3Timer.Enabled:=False;
    FT3Timer.OnTimer:=nil;
    Application.ProcessMessages;
    FT3Timer.Free;
    FT3Timer := nil;
  end;
end;
 
Voila ;)

n°923152
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 18:18:15  profilanswer
 

Bizarre que ça plante... :/


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°923163
Nico SIA
Posté le 14-12-2004 à 18:21:13  profilanswer
 

Oui, le seul truc qu'on voyait a la limite c'est entre le free et le nil, que l'objet puisse etre appele si l'event avait ete empile mais bon, dans le ontimer, il check bien le assigned et la on le passe a nil avant de detruire donc ca devrait etre ok ...

n°923171
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-12-2004 à 18:24:12  profilanswer
 

Assigned c'est juste un test si <> nil
Il n'y a aucun moyen de savoir si un objet a été détruit ou non, à moins de le mettre à nil après destruction (ou en le passant à FreeAndNil en remplacement du Free et de la mise à nil).
Vu le code posté je dirais que le problème vient d'ailleurs dans le code, mais pour trouver d'où c'est pas évident :D


Message édité par antp le 14-12-2004 à 18:24:36

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  TTimer et destruction

 

Sujets relatifs
Prohiber l'allocation/destruction d'objetDestruction Session -> Libération de ressources
[C++] Destruction non voulueIntégrer un TTimer a son propre component...et avoir une chtite icone
[java] [applet] formulaire via une applet, destruction... [res+source]TThread et oui encore ! (et TTimer :D)
Session : Destruction et recréation[PHP] - Destruction de session
Plus de sujets relatifs à : TTimer et destruction


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)