Cloisonnement de variables dans une DLL

Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010 - 22 janv. 2005 à 15:15
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 23 janv. 2005 à 11:39
Il s'agit d'une simulation de 4 machines identiques dépendantes les unes des autres qui communiquent certaines de leurs variables entre-elles.


Je travaille avec VB6


Le projet de base (Projet.exe) sert de plaque tournante et permet aux machines de communiquer entre elles
Projet.exe connait Machine1, Machine2, Machine3 et Machine4 par contre
Machine1, Machine2, Machine3 et Machine4 ne se connaissent que par l'intermediaire de Projet.exe

La structure du programme Première version est la suivante :
1 EXE ActiveX
Projet.EXE
1 Feuille
1 Module (Créé les 4 objets Machine1 à 4)
1 Module de Classe (permet la communication avec les 4 machines)
4 DLL activeX identiques
Machine1.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
5 Modules (2800 variables plus programmation du fonctionnement de la machine)
1 Modules de Classe (permet la communication avec Projet.exe)
Machine2.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
5 Modules (2800 variables plus programmation du fonctionnement de la machine)
1 Modules de Classe (permet la communication avec Projet.exe)
Machine3.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
5 Modules (2800 variables plus programmation du fonctionnement de la machine)
1 Modules de Classe (permet la communication avec Projet.exe)
Machine4.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
5 Modules (2800 variables plus programmation du fonctionnement de la machine)
1 Modules de Classe (permet la communication avec Projet.exe)

Ayant 4 DLL totalement identiquent, en deuxième version, j'écris la Deuxième version suivante :
1 EXE ActiveX
Projet.EXE
1 Feuille
1 Module
1 Module de Classe (permet la communication avec les 4 machines)
1 DLL activeX
Machine.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
5 Modules (2800 variables plus programmation du fonctionnement de la machine)
1 Modules de Classe (permet la communication avec Projet.exe)


Je me retrouve avec des variables nullement cloisonnées et le programme ne fonctionne pas (par exemple, Si je bascule l'interrupeur d'une machine, les autres Machine change aussi et il ne le faudrait pas...).


J'ai opté alors pour une troisième version en incluant les 5 modules standards dans le module de classe et en déclarant Set ... New les feuilles
1 EXE ActiveX
Projet.EXE
1 Feuille
1 Module
1 Module de Classe (permet la communication avec les 4 machines)
1 DLL activeX
Machine.DLL
12 Feuilles (Les interrupteurs, disjoncteurs etc.. à activer)
1 Modules de Classe (2800 variables plus programmation du fonctionnement .....)


Je me retrouve avec un module de classe avec 18000 lignes et Le programme fonctionne mais moitié moins vite


La première version fonctionne parfaitement mais pour le "fun" compiler une seule DLL serait mieux
Comment faire pour déclarer des variables dans un Simple module, qu'elles soient donc reconnues par les feuilles et le module de Classe du projet mais qu'elles soient cloisonnées avec les nouvelles instances ?


Pourquoi je perds moitié rapidité dans la troisième version ?

3 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
22 janv. 2005 à 17:40
Tu devrais faire un tableau : une case du tableau pour chaque instance
de classe (instance que tu peux différencier dans le Class_Initialise
en listant les données du tableau justement) par exemple.



Sinon, tu as essayé les variables publiques dans les classes : accessibles par tous mais localisé à une instance ?

DarK Sidious

Administrateur et reponsable VB/API du site www.ProgOtoP.com
0
Daghis Messages postés 22 Date d'inscription samedi 22 janvier 2005 Statut Membre Dernière intervention 10 octobre 2010
23 janv. 2005 à 11:32
Tout d'abord, merci de ta réponse.
En effet, quand je relis ma question, ce n'est pas très explicit
Mais tu es très perspicace car le problème se situe bien au niveau de la déclaration de variables Publics dans un module de classe.
Seulement dans ce cas, les autres module standards et forms ne les reconnaissent pas ?
Par contre, si je déclare ces variables dans un module standard pas de problème tout le monde les reconnaisent seulement les variables ne restent pas "personnalisées" à l'instance.
C'est pour cette raison que j'ai écris l'intégralité des modules standards dans le module de classe mais ce n'est pas une "belle" solution. Module très long et en plus un énorme ralentissement de l'odi.

Mon programme est écrit comme ci-dessous :
Il marche bien seulement, il me faut le compiler 4 fois sous nom différent pour avoir 4 objets avec sa variable personnalisée
Form Visualise l'Interrupteur
Private sub Inter_Click() ' Action sur un Interrupteur
A = not A
end sub
-----------------------------
Module Standard
Public A as Byte ' Déclaration de la variable A
Function Fil() as byte
Fil = A and ...... or .... et suite de la fonction
end Function
-----------------------------
Module de Classe
Public function EtatFil() as byte
EtatFil = Fil
end function
-----------------------------

J'aurais voulu écrire le programme comme ci-dessous mais la variable A n'est pas reconnue par Form et Module ??

Form Visualise l'Interrupteur
Private sub Inter_Click() ' Action sur un Interrupteur
A = not A
end sub
-----------------------------
Module Standard
Function Fil() as byte
Fil = A and ...... or ....
end Function
-----------------------------
Module de Classe
public A as Byte ' Déclaration de la variable A
Public function EtatFil() as byte
EtatFil = Fil
end function
-----------------------------

Je l'écris comme ci'dessous et cette fois çà marche mais module de classe énorme et ralentissement de l'ordi
Form Visualise l'Interrupteur
Dim Machine as object
Public sub Objt(byref Réf as object)
Set Machine = Réf
end sub
Private sub Inter_Click() ' Action sur un Interrupteur
Machine.Interrupteur
end sub
-----------------------------
Module de Classe OBJET
Public A as Byte ' Déclaration de la variable A
Public sub Interrupteur
A = not A
End Sub
Function Fil() as byte
Fil = A and ...... or ....
end Function
Public function EtatFil() as byte
EtatFil = Fil
end function
-----------------------------

Je tourne en rond sur ce problème depuis pas mal de temps. Il y a quelquechose que j'oublie ou que je n'ai pas compris. Si tu peux m'aider encore merci

Daghis
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
23 janv. 2005 à 11:39
Ok, tu ne peux pas accèder à partir de ton module à ta variable A, ce
qui est normal vu que A est cloisonné dans une instance de classe.



Pour remédier à ce problème, tu peux implémenter une propriété dans ton module :



Private m_byA as byte



Public Property Let Variable (byval byVar as Byte)



Let m_byA = byVar



End Property



Et maintenant, il te suffit de donner la bonne valeur à ton A à partir de ta classe à chaque appel de EtatFil.



C'est une solution moins lourde que l'utilisation du tableau dont je
t'ai parlé précédement, mais pas forcément plus propre ! (il faut bien
faire attention à l'appel à Fill pour que la variable prenne la bonne
valeur !)

DarK Sidious

Administrateur et reponsable VB/API du site www.ProgOtoP.com
0
Rejoignez-nous