Bonjour,
J'ai un soucis avec mon application. Lorsque je la quitte j'ai un "Opération de pointeur incorrect" qui apparait.
Je n'ai aucun moyen de voir à quel moment cette erreur apparait.
Si vous avez une idée pour me mettre sur la piste.
Merci.
Bonjour,
J'ai un soucis avec mon application. Lorsque je la quitte j'ai un "Opération de pointeur incorrect" qui apparait.
Je n'ai aucun moyen de voir à quel moment cette erreur apparait.
Si vous avez une idée pour me mettre sur la piste.
Merci.
Salut,
Tu utilises quoi comme IDE ?
Quel est le code dans le destroy de ta form principale ?
Quel code s'execute en faîte à la fin ?
Salut, merci de t'intéresser a mon problème.
L'ide est code gear delphi 2007.
Je n'ai pas fait de fonction destroy pour ma forme principale.
Je n'arrive pas à savoir quel code s'exécute, même lorsque j'essaie de voir où se déclenche l'exception en mode debug, cela ne me renvoie pas à la ligne correspondante.
Je ne sais pas trop comment m'y prendre.
As-tu des TObjectList dans ta form? Souvent cette erreur est dû à cela.
En effet si un TObjectList est en OwnsObject, il va chercher à libérer tout son barda... Le problème c'est que si tu as supprimé certains items, il risque de t'envoyer bouler...
Bonjour,
Oui effectivement j'ai bien TObjectList dans un de mes objets!
Je me suis rendu compte ce matin que le problème venait de la destruction de celui-ci.
Par contre je n'ai pas supprimé un des objets contenu dans le TObjectList. Je ne fais qu'en ajouter.
Y a t'il une méthode particulière pour le détruire?
Merci pour votre aide.
Si tu as construit ta TObjectList avec un create sans paramètre tu n'as pas à t'occuper de la destruction des objets à l'intérieur, c'est gérer automatiquement.
Tu dis que tu ne fais qu'ajouter des objets à l'intérieur, mais ces objets sont-ils référencés autre part? Est-ce que tu n'affecte pas un des objets de la liste a une variable ou a une autre liste? Vérifie bien ce que tu fais de tes objets. Typiquement, un objet de la liste est déjà détruits et quand la TObjectList se détruit, au préalable, elle appelle pour chacun de ses objets le destructeurs, donc s'il y en a un ou plusieurs de déjà détruits
Pour pouvoir répondre a ta question il faudrait que je sache si lorsquon fait un add sur la tobjectlist l objet en paramètre de l add est copie ou si c'est le pointeur sur l'objet qui est copie. J'espère que je suis comprehensible.
Merci pour ton aide.
C'est justement le pointeur qui est inséré, c'est comme ça que tu n'as pas besoin de t'occuper de la destruction des objets à l'intérieur et c'est pour cela qu'il faut faire attention à ce que tu fais de ces objets!
Ah !
Donc il ya surrement soucis puisque l'objet que j'insere provient d'un thread. Il faut donc que je le copie dans un autre objet avant de l'insérer dans la liste.
Sinon tu construit ta ObjectList avec pour paramètre du constructeur False et tu gère toi-même la destruction de tous tes objets!
Résolu en mettant a false la propriété OwnsObjects et en faisant un clear avant de faire le free.
Je peux considérer que ma mémoire est vidée?
Merci beaucoup pour ton aide.
Edit: Titre modifié, ca peut surement aider avec un nom plus clair.
Normalement tu n'as pas besoin de faire ce clear avant le free. Vérifie que tu n'as pas de memory leak, a savoir que les objets a l'interieurs de ta liste son bien détruits dans ton thread ou ailleurs!
Effectivement pas besoin de clear avant le free.
Comment je peux vérifier que les objets sont correctement détruits?
Je sais pas si c'est possible, car finalement ce ne sont que des pointeurs... Et ils pointront toujours vers un endroit de la mémoire... (si tu supprimes ce qu'il y'a à cet endroit, ils risquent de pointer vers nimporte quoi !)Comment je peux vérifier que les objets sont correctement détruits?
Mais en principe le free après le clear, ça ne change rien ? Vu que free va quand même libérer tous les objets... (si OwnObjects à true)...
Attention si tu mets OwnObjects à false, il faudra detruire tout tes TObject...
Sinon l'histoire du thread, ne change rien je pense... Si tu utilises synchronize...
TObjectList est il threadsafe ?
Hum j'ai quand meme un petit souci. Quand je lis la doc en ligne je vois :
Ce qui signifie qu'en le mettant a False je ne détruis plus les objets qui sont dans la liste...OwnsObjects permet à TObjectList de contrôler la mémoire de ses objets. Si OwnsObjects est à true (par défaut),
[...]
Appeler Clear libère tous les objets de la liste en plus de vider la liste.
[...]
Appeler le destructeur libère tous les objets de la liste en plus de détruire l'objet TObjectList lui-même.
Pourquoi j'ai donc une erreur de pointeur quand j'essaie de détruire les objets qui sont dans la liste??? Je suis certain que ces objets n'appartiennent pas au thread.
Je ne comprends plus rien
Oui en fait j'ai une propriété dans mon thread qui est en lecture seule qui renvoie vers l'objet que je souhaite mettre dans la liste.
Je récupère la valeur de la propriété dans un objet puis je met cet objet dans ma liste... Un peu de code pour être plus clair
La propriété dans mon thread :
son utilisation dans le thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part property mesures : TMesures read Fmesures;
Utilisation de la propriété dans le "programme principal":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Fmesures := TMesures.Create; // Et je remplis les champs de Fmesure
GestionCamera1 étant le nom de mon objet Thread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mesure := GestionCamera1.mesures; GraphicMapping_visu.CustomObject := mesure;
J'espere être un peu plus clair.
A false en effet tu ne détruis plus rien du tout !Ce qui signifie qu'en le mettant a False je ne détruis plus les objets qui sont dans la liste...
Pourquoi j'ai donc une erreur de pointeur quand j'essaie de détruire les objets qui sont dans la liste??? Je suis certain que ces objets n'appartiennent pas au thread.
Je ne comprends plus rien
A false tu as une erreur de pointeur, je n'ai pas tout suivi, en principe tu dois avoir une erreur de pointeur à true pas à false ?
Par contre ton histoire de thread est confuse, une TObjectList n'appartient pas à un thread, ce sont deux choses différentes...
Bon alors, maintenant ton code...
je ferai
Dans l' Application_principale :
Dans le thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 var monobjectlist:TobjectList; monobjectlist := tobjectlist.create; // debut execution ..... .... ... ... monobjectlist.free; // fin execution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 var monobjet:tobject; procedure thread .execute : monobjet := tobject.create; monobjet.propriete := 'tatatitite'; monobjet.ident := 5545; ... ... synchronize(synchronisatio_des_deux); // on synchronize le thread avec l'execution principale //Attention tu ne le détruis pas procedure thread .synchronisatio_des_deux : begin application_principale.monobjectlist.add(monobjet); end;
Quelque chose comme ça... Le bout de code que tu donnes est trop petit pour comprendre réelement ce que tu fais...
Bon courage
Oui quand je mets a true j'ai un erreur de pointeur.
Je vais te mettre plus de code pour être plus clair. C'est ca quand on est dans son projet, on comprend tout en lisant 2 lignes ^^.
Alors il faut que je te précise que le TObjectList appartient à GraphicMapping_visu. J'y accede par la propriété CustomObject.
Programme principale :
Toujours dans le programme principal, la fonction suivante boucle et se synchronise avec le thread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 procedure TFormPp.miseAjourAffichage(nb_traitees : Integer); var mesure : TMesures; nb_restantes, mesure_actuelle : Integer; begin // On récupère les résultats de la mesure mesure := GestionCamera1.mesures; GraphicMapping_visu.CustomObject := mesure; // ICI J'UTILISE mesure // On met à jour le compteur de cellules nb_restantes := nb_cellules - nb_traitees; Frame_principale.Panel_restantVisu.Caption := inttostr(nb_restantes); Application.ProcessMessages; end;
Voila pour la partie programme principal. Maintenant le thread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 procedure TFormPp.mesuresVisu; var loop,loop2,loopCoord,nb_traitees: integer; Coord: TTab_Coord; premiere_boucle: boolean; begin // On lance le thread GestionCamera1.Resume; nb_traitees := 0; // Indique qu'on est dans la premiere boucle premiere_boucle := True; for loop2 := 0 to GraphicMapping_visu.CountEmplacementPlateau - 1 do begin for loop := 0 to GraphicMapping_visu.CountEmplacementModule -1 do begin // On attend la fin des mesures FEventFinMesures.WaitFor(INFINITE); //*** Enregistrement des résultats et mise à jour de l'affichage if not premiere_boucle then begin inc(nb_traitees); miseAjourAffichage(nb_traitees); end; //*** Calcul de la nouvelle cellule et déplacement GraphicMapping_visu.EmplacementPlateau:=loop2; GraphicMapping_visu.EmplacementModule:=loop; // On extrait les coordonnées Coord:=GraphicMapping_visu.ExtractCoord(4); for loopCoord := low(Coord) to high(Coord) do begin // On déplace le robot sur la cellule // if robot.pointApoint(coord[loopCoord].X + 88.34, 483.25 - coord[loopCoord].Y, 0, 0) then // On active le thread Camera FEventFinDeplacement.SetEvent; premiere_boucle := False; end; end; end; Inc(nb_traitees); miseAjourAffichage(nb_traitees); GestionCamera1.stopThread; end;
Voila si ca peut t'aider un peu plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 procedure TGestionCamera.Execute; Var nb_scenes : Byte; resultatsMesures : TTableauDouble; scene_actuelle, mesure_actuelle, parametre_actuel: Integer; test : Integer; begin nb_scenes := Length(tableauScenes); test := 1; repeat // On charge la scène // camera.numScene := tableauScenes[0].numScene; // On attend la fin du déplacement (message du robot) FEventFinDeplacement.WaitFor(INFINITE); Fmesures := TMesures.Create; mesure_actuelle := 0; for scene_actuelle := 0 to length(tableauScenes) - 1 do begin with tableauScenes[scene_actuelle] do begin resultatsMesures := nil; // On prend les mesures resultatsMesures := camera.acquisitionEtMesure; //On enregistre les mesures dans l'objet -> que je vais mettre dans le TObjectListe with Fmesures do begin // On parcours le tableau de paramètre pour récupérer l'id_mesure et la position dans la trame for parametre_actuel := 0 to length(tabParametre) - 1 do begin // On agrandie le tableau contenant la data SetLength(tabMesuresVisuels, length(tabMesuresVisuels) + 1); with tabParametre[parametre_actuel] do begin // On enregistre l'id_mesure tabMesuresVisuels[mesure_actuelle].idMesure := idMesure; // On enregistre la valeur mesurée tabMesuresVisuels[mesure_actuelle].valeurMesuree := resultatsMesures[positionTrame]; // On met a jour l'état des specs with tabMesuresVisuels[mesure_actuelle] do begin limitesOK := (valeurMesuree > limites.specMin) and (valeurMesuree < limites.specMax); end; end; // On incrémente le nombre de mesures effectuées Inc(mesure_actuelle); end; end; end; // On charge la scène suivante s'il y en a une if (scene_actuelle + 1) < nb_scenes then // camera.numScene := tableauScenes[scene_actuelle + 1].numScene; end; // On informe le robot de la fin de la mesure FEventFinMesures.SetEvent; Inc(test); until Terminated; end;
Merci encore.
si j'ai bien compris :
- GraphicMapping_visu.CustomObject est un TObjectList
- auquel tu associe un TMesures (GraphicMapping_visu.CustomObject := GestionCamera1.mesures
TMesures est-il bien un descendant de TObjectList ?
où détruis-tu ta liste ? dans le thread où elle est créée, ou dans la fiche d'affichage ?
dans le code que tu montres, je ne vois aucun TMesures.Add(qqch) mais juste une utilisation de tableaux dynamiques
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager