|
| Blocage Assemblage Dotnet |
| Iniciado por titioun, 03,nov. 2017 08:52 - 7 respuestas |
| |
| | | |
|
| |
Miembro registrado 92 mensajes |
|
| Publicado el 03,noviembre 2017 - 08:52 |
Bonjour à tous, quelqu'un pourrait-il m'aider à interpréter ce message d'erreur .
Il provient de l'assemblage dotnet Zedgraph que j'utilise pour afficher des données de capteurs recueillis par la liaison série.
La procécure GraphRedraw est appelée toutes le 50 ms et me permet d'afficher un graphe en "live".
Il semble apparaître lorsque le nombre de points à tracer devient importants mais je n'ai pas réussi à définir ce nombre. (entre 45000 et 130000 points mais cela ne semble pas répétable.
Merci de vos conseils
Erreur à la ligne 26 du traitement Procédure globale Graph_Redraw. L'invocation de la méthode <AxisChange()> du type <Void> a échoué Le framework .NET a renvoyé l'erreur suivante : La référence d'objet n'est pas définie à une instance d'un objet.
**********************************************
----- Informations techniques -----
Appel WL : Traitement de 'Procédure globale Graph_Redraw' (COL_ProcéduresZedgraph.Graph_Redraw), ligne 26, thread 0
Que s'est-il passé ? L'invocation de la méthode <AxisChange()> du type <Void> a échoué Le framework .NET a renvoyé l'erreur suivante : La référence d'objet n'est pas définie à une instance d'un objet.
Code erreur : 200002 Niveau : erreur fatale
Dump de l'erreur du module 'wd210net4_64.dll' (21.0.10.0). Identifiant des informations détaillées (.err) : 200002 Informations de débogage : System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet. à ZedGraph.CurveItem.GetRange(Double& xMin, Double& xMax, Double& yMin, Double& yMax, Boolean ignoreInitial, Boolean isBoundedRanges, GraphPane pane) à ZedGraph.CurveList.GetRange(Boolean bIgnoreInitial, Boolean isBoundedRanges, GraphPane pane) à ZedGraph.GraphPane.AxisChange(Graphics g) à ZedGraph.MasterPane.AxisChange(Graphics g) à ZedGraph.ZedGraphControl.AxisChange() --- Fin de la trace de la pile d'exception interne --- à System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) à System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) à CDotNetMethod.bInvoke(Char* pszTypeName, Char* pszMethodName, Char* pszParameters, MethodInfo gcMethod, Object gcObj, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation) Informations supplémentaires : EIT_EXCEPTIONDOTNET EIT_PILEWL : Procédure globale Graph_Redraw (COL_ProcéduresZedgraph.Graph_Redraw), ligne 26 EIT_DATEHEURE : 03/11/2017 05:33:03 EIT_TYPE_WDFILE : <7> EIT_IDCODE : <458752> |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 352 mensajes |
|
| Publicado el 03,noviembre 2017 - 11:03 |
Bonjour,
QUAND EXCEPTIONEXCEPTION DANS GraphRedraw () FAIRE Trace(ExceptionInfo()) FIN
PS: pourquoi je n'arrive pas à écrire "QUAND EXCEPTION DANS" dans mon code???Mensaje modificado, 03,noviembre 2017 - 11:06 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 92 mensajes |
|
| Publicado el 03,noviembre 2017 - 12:45 |
oui c'est vrai. j'ai ajoute le Trace mais il n'est meme pas déclenché lorsque l'erreur survient.
Voilà comment j'en suis arrivé là :
J'ai une procédure Port_Lecture exécutée lors de l'entrée de caractères sur la liaison série.
Avant, c'est à dire en version Windev 19 je pouvais mettre directement dans la procédure Port Lecture les instructions de mise à jour de mongraphe
FEN_Main.MonGraphe.Refresh() FEN_Main.MonGraphe.AxisChange() FEN_Main.MonGraphe.Invalidate()
En passant en 21 et en 22 ces instructions renvoient une erreur dès le premier appel : La même erreur est renvoyée si je place les instruction dans une procédure appelée depuis Port_Lecture Erreur à la ligne 22 du traitement Procédure globale Graph_Redraw1. La variable '' n'est pas un objet.
Du coup j'ai adopté la solution d'exécuter la procédure Graph_Redraw() dans un thread en paramétrant les automatismes. Fonctionnement infini période 0.5 seconde. Ca fonctionne mais génère l'erreur de mon premier message.
Je peux facilement reproduire le plantage en simulant des données plutôt qu'en passant par la procédure Port_Lecture.
J'ai écrit une procédure Simul qui génère mes points toutes les 5 ms : Si j'appelle Graph_Redraw1 (qui est la copie de Graph_Redraw mais sans les automatisme) dans cette procédure, je n'ai pas de plantage.
Par contre si j'utilise la procédure automatique Graph_Redraw ça plante très rapidement mais de façon aléatoire.
Je vois bien que si j’accélère l'automatisme de l'appel le plantage arrive plus rapidement mais il ne semble pas lié au nombre de points affiché
Peut être que si vous comprenez pourquoi j'ai ce message d'erreur "La variable '' n'est pas un objet.", cela va m'aider.
Cordialement |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 962 mensajes |
|
| Publicado el 03,noviembre 2017 - 23:04 |
hello, as-tu essayé un truc du genre :
bm est un "System.Drawing".Bitmap(1,1) g est un Graphics dynamique = Graphics.FromImage(bm) Zedpanneau est un GraphPane dynamique = FEN_Main.MonGraphe.GraphPane
Zedpanneau.AxisChange(g)
-- Ami calmant, J.P |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 92 mensajes |
|
| Publicado el 05,noviembre 2017 - 12:22 |
Bonjour,
Merci JP mais j'ai toujours le message à la ligne Zedpanneau est un GraphPane dynamique = FEN_Main.MonGraphe.GraphPane La variable" n'est pas un objet
Maintenant j'ai fait un test qui m'oriente vers une autre voie.
J'ai toujours ma Procédure REDRAW qui fonctionne en tache de fond et "par hasard" j'ai supprimé une procédure que j'exécute dans Port Lecture pour sauvegarder les données sous la forme d'un fichier texte au cas où la manip plante.
sString est une chaîne ANSI = NumériqueVersChaîne(rDurée)+";"+NumériqueVersChaîne(Val(gs_Buffer_Entree_Cell1)/1000)+";"+NumériqueVersChaîne(gr_Last_Temp) Ecrit_Log(sString,1) Je peux imaginer que cette procédure prend pas mal de temps mais je ne vois pas pourquoi elle viendrait piocher dans des ressources communes avec la procédure Redraw.
Pourtant cela ressemble bien à ça.
D’où l'idée d'utiliser un Mutex ou quelque chose comme ça mais je n'ai aucune expérience avec ces trucs.
Pensez-vous que ce soit une bonne piste ?
Merci |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 962 mensajes |
|
| Publicado el 05,noviembre 2017 - 12:42 |
hello, titioun a écrit :
Maintenant j'ai fait un test qui m'oriente vers une autre voie.
J'ai toujours ma Procédure REDRAW qui fonctionne en tache de fond et "par hasard" j'ai supprimé une procédure que j'exécute dans Port Lecture pour sauvegarder les données sous la forme d'un fichier texte au cas où la manip plante.
Qu'entends-tu par là ? Que quand tu ne mets pas la procédure EcritLog ça ne plante plus ?
-- Ami calmant, J.P |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 92 mensajes |
|
| Publicado el 11,noviembre 2017 - 08:19 |
désolé pour avoir décroché.
Oui c'etait exactement ça c'est comme si ls resources partagées par les fonctions Ecritlog et Redraw se mélangeaient les pinceaux.
Finalement voilà ce que j'ai fait. J'ai repris un autre code source en Windev 22 dans lequel la procédure port lecture incluant l'appel au fonction Zedgraph fonctionnait parfaitement et j'ai réécrit l'interface utilisateur autour.
Ca m'a pris du temps mais au moins ça marche !
C'est comme si windev gardait quelque chose dans la configuration du projet.
A tête reposée j'ai repris mon projet Windev 21 qui plantait. J'ai copié tout le répertoire dans un nouveau dossier. J'ai supprimé tous les fichiers historique backup dll 21
J'ai ouvert le projet en 22 et hop ça marche !
Ne me demandez pas pourquoi .
Même encore pour vos aides.
Amicalement |
| |
| |
| | | |
|
| | |
| |
| Publicado el 14,febrero 2020 - 17:37 |
J'aimerais bien réaliser ce code ecrit en C# en Code Windev sachant que j'ai charger l'assemblage DotNet coté windev
System.Drawing pour le réaliser mais j'ai des problemes dans les déclarations :
private void zkFprint_OnImageReceived(object sender, IZKFPEngXEvents_OnImageReceivedEvent e) { Graphics g = fpicture.CreateGraphics(); Bitmap bmp = new Bitmap(fpicture.Width, fpicture.Height); g = Graphics.FromImage(bmp); int dc = g.GetHdc().ToInt32(); ZkFprint.PrintImageAt(dc, 0, 0, bmp.Width, bmp.Height); g.Dispose(); fpicture.Image = bmp; } |
| |
| |
| | | |
|
| | | | |
| | |
|