PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Copie de tableaux de structures ou classes
Copie de tableaux de structures ou classes
Débuté par Nicolas Magnien, 12 juin 2018 17:07 - 6 réponses
Membre enregistré
63 messages
Popularité : +4 (4 votes)
Posté le 12 juin 2018 - 17:07
Bonjour a tous

Dans le cadre d'un logiciel en multithread je souhaite effectuer des copies de tableaux de classes pour repartir les traitements sur plusieurs thread...
J'ai fait plusieurs tests voilou les resultats:
1-----------------------
//11ms
tableaucopie(TAB_VAR,TAB_VAR1)

2-----------------------
//40ms
POUR i=1 _a_ NB
TAB_VAR1[i]=TAB_VAR[i]
FIN

3-----------------------
//65ms
POUR i=1 _A_ NB
TAB_VAR1[i]:Inc=TAB_VAR[i]:Inc
TAB_VAR1[i]:cVal=TAB_VAR[i]:cVal
FIN

4-----------------------
//12ms
TAB_VAR1<=TAB_VAR

5-----------------------
//17000ms :D :D ;(
Monbuff est buffer
serialise(TAB_VAR,Monbuff,psdBinaire)
deserialise(TAB_VAR1,Monbuff,psdBinaire)

6-----------------------
//2ms!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Transfert(&TAB_VAR1,&TAB_VAR,TableauInfo(TAB_VAR,tiTailleTotale))


Ma question donc!!! vu la performance du test 6!!!
A t on le droit de faire ca sur un tableau????(je pense pas!!!) comment le windev organise t il sa mémoire pour les tableaux... (tout à la suite??, pointeurs uniquement?...)
Pour info le 6 fonctionne j'ai bien les éléments copiés dans l'autre tableau... mais le test plante à la fermeture du logiciel (APPCrash!!!)


Alors la si qqn me répond!!! la classe!!!

--
Nicolas Magnien
oXalis [Supervision Industrielle - Procédés Batch - ERP - MES]
www.decobecq-automatismes.fr
Membre enregistré
32 messages
Posté le 12 juin 2018 - 17:25
Bonjour,

Pour le 6, est-ce que tu t'es assuré que la taille du tableau destination était au moins la même que la tableau source.
Il se pourrait que la copie se fasse mais du coup déborde du tableau et écrase des données en mémoire et cela expliquerait le "appcrash" à la fermeture de l'application.
A+
Membre enregistré
940 messages
Popularité : +66 (68 votes)
Posté le 12 juin 2018 - 17:30
bonjour,

comme là indiqué Lolo83, il faut allouer de la mémoire pour votre tableau destination, du genre :

Dimension(_my_tab_dest,TableauInfo(_my_tab_source,tiNombreTotal))
Transfert(&_my_tab_dest,&_my_tab_source,TableauInfo(_my_tab_source,tiTailleTotale))


mais je pense que vous devriez obtenir les mêmes temps de réponses que la fonction WD TableauCopie()

bon dèv
Membre enregistré
63 messages
Popularité : +4 (4 votes)
Posté le 15 juin 2018 - 14:06
Bonjour

Merci pour vos réponses...
Les 2 tableaux sont bien évidemment de taille (et de type) identique je ne l'avais pas précisé....
Je ne pense pas que "transfert" fonctionne pour cela. cette fonction doit copier une zone mémoire continue... les tableaux de classes ne doivent certainement pas êtres dans une zone continue... >> danger...

Merci encore...

--
Nicolas Magnien
oXalis [Supervision Industrielle - Procédés Batch - ERP - MES]
www.decobecq-automatismes.fr
Posté le 15 juin 2018 - 16:30
Bonjour

Qq soit le temps de réponse entre l'une et l'autre méthode ( sauf la 6 de toute façon qui ne fonctionne jamais complètement pour copier des classes ) les copies directes amènent toujours un bon lot de surprise

le cas d'école :

Ex objet 1 qui a un membre objet dynamique qui référence une classe allouée dans une méthode et détruite au destructeur
Copie de l'objet 1 vers objet 2, l'objet 2 qui est détruit avant le 1, l'objet dynamique référencé par l'objet 1 est déduit dans le destructeur de la 2 : crash

L'utilisation d'une méthode Copy() dans tous els objets est indispensable pour éviter ce genre de surprise … Alors tu vas me répondre, non j'utilise pas d'objet dynamique mais le jour où tu ( ou qq d'autre ) va en utiliser un il va pas spécialement penser à la copie et le résultat sera le même, tandis qu'une méthode copy on sait a quoi elle sert et on peut y commenter le pourquoi du comment

Bon Dev

Marc Fastré
www.marc-fastre.be
Membre enregistré
63 messages
Popularité : +4 (4 votes)
Posté le 18 juin 2018 - 09:57
Bonjour Marc
Tu as bien raison!!! Il faut absolument comprendre le fonctionnement en background... sinon...
Ce genre d'information est parfois difficile à trouver... c'est dommage...
Bon dev...

--
Nicolas Magnien
oXalis [Supervision Industrielle - Procédés Batch - ERP - MES]
www.decobecq-automatismes.fr
Posté le 18 juin 2018 - 10:23
Bonjour Nicolas

Donc c'est le méthode 3 que tu dois utiliser, mais encapsulée dans une méthode Copy par laquelle tu passe l'objet de destination en paramètre

Ce n'est pas la plus rapide mais bon, ce n'est jamais dans ce genre de code qui va plomber les performances

Bon Dev


Marc Fastré
www.marc-fastre.be