Page 1 sur 1

[Résolu][Windev] Dispose ne fonctionne plus avec la 3.1

Publié : 22 juil. 2009 13:27
par darrymt
Bonjour à tous,

Nouveau soucis, je viens de passer à la 3.1 et là problème il semble que lorsque je fais un dispose, celui-ci ne libère pas vraiment l'objet.

Code : Tout sélectionner

	:UneInstance = MonDBContexte>>createInstance()
	monDocBase = :UneInstance>>DatabaseDocument
                ...
                SI MonDBContexte>>hasbyname(Nomsource) ALORS // Nomsource est le nom de ma base et aussi le nom de la table
	        MonDBContexte>>revokeobject(Nomsource)         
	FIN
	
	// LIBERATION DES RESSOURCES
	MonPublipostage>>Dispose       
	:UneInstance>>Dispose
	:Liberer_Ressources(Vl_Args,MonPublipostage,MonDBContexte,:UneInstance,monDocBase,MonArray)
   	SI Nomsource <> Nomsourcegarde ALORS
		SI fFichierExiste(ComplèteRep(xsCheminreptemp)+Sourcemodele+".ODB") ALORS
			SI PAS fSupprime(ComplèteRep(xsCheminreptemp)+Sourcemodele+".ODB",frLectureSeule) ALORS
				Erreur("Impossible de supprimer le fichier "+Sourcemodele+".ODB","Fusion annulée","Veuillez contacter votre installateur")
				RETOUR
			FIN
		FIN
	FIN

Code : Tout sélectionner

PROCEDURE Liberer_Ressources(Vl_Args,MonPublipostage,MonDBContexte,UneInstance,monDocBase,MonArray)
libérer Vl_Args
libérer MonPublipostage
libérer MonDBContexte
libérer UneInstance
libérer monDocBase
libérer MonArray
libérer :oDocument
libérer :oDesktop
En version 3.0 ma commande

Code : Tout sélectionner

:UneInstance>>Dispose
libère le fichier odb que je peux alors supprimer dans la suite de ma procédure.
En version 3.1 la même commande s'exécute sans erreur de code, mais le fichier ne peut être supprimé tant que je ne ferme pas soffice.bin et soffice.exe depuis le gestionnaire des tâches. Il y aurait bien la solution kill, mais que je ne peux pas utiliser sinon les autres documents OO des utilisateurs seront fermés également.
Y a t-il une différence-évolution dans la façon de libérer entre la 3.0 et la 3.1 ?

Un autre soucis mais avec la 3.0, lorsque je lance mon code sur une machine ayant un intel core 2 Duo E4600 tournant sous winxp Pro, la fusion se fait correctement mais au moment de la libération des ressources je me retrouve avec un Access Violation en test comme en exe, que je n'ai jamais sur la machine de développement qui tourne sur un AMD Athlon 64 X2 Dual Core Processor 4400+ et Windows Vista Pro. Je précise que l'hyperthreading est désactivé et que la fusion sous Word marche sur les 2 configs, donc si quelqu'un a une piste, il recevra toute ma gratitude.

Le Modérateur a écrit : :alerte: Merci de ne pas inventer et de respecter la syntaxe des balises : http://user.services.openoffice.org/fr/ ... c1369.html
Le balisage doit bien sûr être correctement orthographié (première lettre en majuscule puis le reste en minuscules).

Re: [Windev] Dispose ne fonctionne plus avec la 3.1

Publié : 23 juil. 2009 08:07
par bm92
Bonjour,
Depuis des années le Developer's Guide demande de fermer les documents par leur méthode close et non par la méthode dispose. Les documents *.odb ne suivaient pas initialement les principes de réalisation d'un document ordinaire, il est probable que ce soit amélioré en 3.1. Je pense donc qu'il faudrait fermer monDocBase par close et libérer UneInstance. Et ceci dans la séquence SI PAS ...FIN, et non pas à la fin du code.

Code : Tout sélectionner

   monDocBase>>close(True)
   UneInstance>>dispose
FIN
Je pense que les .dispose sur UneInstance et MonPublipostage sont inutiles. Les données devraient être libérées automatiquement.

Re: [Windev] Dispose ne fonctionne plus avec la 3.1

Publié : 23 juil. 2009 10:47
par darrymt
Bonjour Bernard,

Un grand merci car grâce à ton aide celà fontionne sur ma config de développement (AMD) sur l'intel toujours un Access Violation (Je vais créer un autre fil pour ça), voici le code qui fonctionne :

Code : Tout sélectionner

:oDocument>>Close(Vrai) 
monDocBase>>Close(Vrai)
:UneInstance>>Dispose
libérer MonDBContexte
libérer Vl_Args          
libérer MonPublipostage 
Par contre je suis qu'en même obligé de faire un dispose sur :UneInstance, sinon le fichier odb n'est pas libéré et ne peut pas être supprimé.

Merci encore