> Ca va être chaud, alors j'ai fait un test vite fait :
> Ca va être chaud, alors j'ai fait un test vite fait :
> Ca va être chaud, alors j'ai fait un test vite fait :
Ca va être chaud, alors j'ai fait un test vite fait :
Pourquoi ne peux tu pas supprimer bêtement tout le code de l'interfac e
graphique... pour ne garder que ce qui concerne notre probleme, et le p oster
ici ?
Ca va être chaud, alors j'ai fait un test vite fait :
Pourquoi ne peux tu pas supprimer bêtement tout le code de l'interfac e
graphique... pour ne garder que ce qui concerne notre probleme, et le p oster
ici ?
Ca va être chaud, alors j'ai fait un test vite fait :
Pourquoi ne peux tu pas supprimer bêtement tout le code de l'interfac e
graphique... pour ne garder que ce qui concerne notre probleme, et le p oster
ici ?
> Ok, mais je ne sais pas si ca va servir, j'utilise un control qui
> Ok, mais je ne sais pas si ca va servir, j'utilise un control qui
> Ok, mais je ne sais pas si ca va servir, j'utilise un control qui
> Ok, mais je ne sais pas si ca va servir
> Ok, mais je ne sais pas si ca va servir
> Ok, mais je ne sais pas si ca va servir
Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne chan ge
pas le probleme. Il me semble que tu as viré certaines lignes de code qui
sont importantes pour le probleme : la fonction qui pose probleme
(gridEXFactures_CellUpdated) est private et n'est jamais utilisée par la
classe elle même, elle ne peut donc pas etre appelée, et il ne peut donc pas
y avoir de probleme à l'execution (dans cette fonction en tous cas)
Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne chan ge
pas le probleme. Il me semble que tu as viré certaines lignes de code qui
sont importantes pour le probleme : la fonction qui pose probleme
(gridEXFactures_CellUpdated) est private et n'est jamais utilisée par la
classe elle même, elle ne peut donc pas etre appelée, et il ne peut donc pas
y avoir de probleme à l'execution (dans cette fonction en tous cas)
Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne chan ge
pas le probleme. Il me semble que tu as viré certaines lignes de code qui
sont importantes pour le probleme : la fonction qui pose probleme
(gridEXFactures_CellUpdated) est private et n'est jamais utilisée par la
classe elle même, elle ne peut donc pas etre appelée, et il ne peut donc pas
y avoir de probleme à l'execution (dans cette fonction en tous cas)
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appel ée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:
Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appel ée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appel ée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
Quand il y a une StackOverFlow, généralement le débuggeur est aux fraises
sur la zone qui pose problème.
Le bon vieux printf("coucou") de notre glorieux passé C est encore
d'actualité.
Donc, fais des debug.Trace dans ta boucle pour voir.
Quand il y a une StackOverFlow, généralement le débuggeur est aux fraises
sur la zone qui pose problème.
Le bon vieux printf("coucou") de notre glorieux passé C est encore
d'actualité.
Donc, fais des debug.Trace dans ta boucle pour voir.
Quand il y a une StackOverFlow, généralement le débuggeur est aux fraises
sur la zone qui pose problème.
Le bon vieux printf("coucou") de notre glorieux passé C est encore
d'actualité.
Donc, fais des debug.Trace dans ta boucle pour voir.
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appelée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:
Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appelée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
En fait, la ligne qui pose prob est encore là, enfin, simplifier
justement, juste au dessus des commentaires :
Tbl.Rows[0][0] = "Test";
Il se bloque là dessus
Merci pour ton aide. :)
Vincent Lascaux wrote:Ok, mais je ne sais pas si ca va servir
Quand je disais de virer du code, je parlais de virer celui qui ne
change pas le probleme. Il me semble que tu as viré certaines lignes
de code qui sont importantes pour le probleme : la fonction qui pose
probleme (gridEXFactures_CellUpdated) est private et n'est jamais
utilisée par la classe elle même, elle ne peut donc pas etre appelée,
et il ne peut donc pas y avoir de probleme à l'execution (dans cette
fonction en tous cas)
Bon, on commence par le début ;-).
StackOverFlow, c'est un dépassement de capacité de la pile.
La pile c'est la zone mémoire qui est utilisé pour stocker les vari ables
automatiques.
Les variables automatiques, c'est les variables que le langages alloue
automatiquement comme les arguments du méthode que tu passe par valeu r ou
les variables locale de type ValueType (in, float, double, struct, etc. ).
Ces variables sont à l'opposé des variables allouées avec un new qui elle
sont stockées dans le tas (heap). Le garbage collector ne s'occupe qu e du
tas.
La gestion de variables automatiques se fait par empilement-dépilemen t.
Quand tu entres dans une méthode, la pile augmente de la taille de te s
variables automatiques (paramètres et variables locales). Quand tu so rs de
la méthode, la pile diminue d'autan qu'elle a augmenté en entrant.
Donc entre l'entrée dans une méthode et sa sortie, la pile a augmen té en
taille. Mais la taille de la pile au moment de la sortie est la même qu'à
son entré dans la méthode.
C'est pareil pour tous les langages, .NET ou pas.
Alors comment une pile peut-elle grandir jusqu'à exploser l'espace qu i lui
était réservé ?
J'en vois deux:
- une récursivité trop profonde, c'est à dire une méthode qui s 'appel elle
même de manière direct ou indirect, ce qui entraîne une augmentat ion de la
pile à chaque appel qui entraînera un nouvel appel avec une nouvell e
augmentation de la pile et ainsi de suite jusqu'au dénouement fatale.
- une taille de l'ensemble des variables automatiques très importante s,
comme une structure contenant des millions de int passé par valeur à
plusieurs méthodes successivement. Cette hypothèse est peu plausibl e avec
les langages .NET qui utilisent énormément les références sur d es objets
contrairement au C avec ses tableaux.
Tout cela ne sont que des généralités mais il faut bien être co nscient de la
situation, qui est pour le moins critique et hostile.
Si mes lieux communs ont été suffisamment clairs, le fait d'appeler une
méthode comme MessageBox qui utilise des variables automatiques (au m oins
pour ses paramètres) quand une StackOverFlow est lancée sera aussi saugrenue
que de faire un new pendant le traitement d'une exception de type
OutOfMemory ;-).
Si l'image te frappe, tu comprendra que tu ne verra pas de MessageBox c ar tu
as subis une StackOverFlowException pendant le traitement de la premiè re
exception (c'est un throw dans un catch).
Il ne reste donc qu'a rusé pour voir le problème avant que la pile soit
pleine car après, c'est Tchernobyl dans la mémoire, même le déb uggeur y perd
ses petits car le contenue de la stack a de fortes chances d'être cor rompu.
Alors, petit padawan, depuis des temps qui datent de bien avant l'exist ence
des premiers débuggeurs, de vaillants programmeurs, seulement munis d e leur
simples bibliothèques d'entrée-sortie (et même pas laser), ont mi s au point
une technique ultra puissante.
C'est simplement d'afficher sur la console des traces de l'activité d u
programme.
Le printf("coucou") de mon précédent post est une instruction C qui ne fait
qu'afficher "coucou" dans la console du programme à la suite des autr es
affichages. Si dans la console a affiché un "coucou", c'est que nous sommes
passée une fois dans cette instruction, si il y a 2 "coucou", c'est q ue nous
sommes passée deux fois dans cette instruction etc...
Avec .NET, les bibliothèques d'entrées-sorties se sont perfectionné es et
"Debug.Write("coucou")" est l'instruction .NET qui va permettre d'affic her
"coucou" dans la fenêtre "Sortie" ou "Output" de VS.NET, la fenêtre qui est
généralement en bas et qui indique le chargement des assemblies.
<CODE>Debug.WriteLine(i.ToString() + " " +
Tbl.Rows.Length.ToString());</CODE>
dans ta boucle permettra de voir l'évolutions de ces valeurs avant qu e le
drame (l'explosion de la pile) n'arrive.
PS: Voici un exemple du pourquoi il ne faut pas catcher les exceptions quand
on n'est pas capable des les résoudre.
Ne catchez pas à tord et à travers ;-). En catchant Exception, vous pouvez
avoir une OutOfMemoryException et si vous avez pas réservé de la mé moire
pour un traitement d'urgence, vous aurez l'air fin avec votre catch.
Bon, on commence par le début ;-).
StackOverFlow, c'est un dépassement de capacité de la pile.
La pile c'est la zone mémoire qui est utilisé pour stocker les vari ables
automatiques.
Les variables automatiques, c'est les variables que le langages alloue
automatiquement comme les arguments du méthode que tu passe par valeu r ou
les variables locale de type ValueType (in, float, double, struct, etc. ).
Ces variables sont à l'opposé des variables allouées avec un new qui elle
sont stockées dans le tas (heap). Le garbage collector ne s'occupe qu e du
tas.
La gestion de variables automatiques se fait par empilement-dépilemen t.
Quand tu entres dans une méthode, la pile augmente de la taille de te s
variables automatiques (paramètres et variables locales). Quand tu so rs de
la méthode, la pile diminue d'autan qu'elle a augmenté en entrant.
Donc entre l'entrée dans une méthode et sa sortie, la pile a augmen té en
taille. Mais la taille de la pile au moment de la sortie est la même qu'à
son entré dans la méthode.
C'est pareil pour tous les langages, .NET ou pas.
Alors comment une pile peut-elle grandir jusqu'à exploser l'espace qu i lui
était réservé ?
J'en vois deux:
- une récursivité trop profonde, c'est à dire une méthode qui s 'appel elle
même de manière direct ou indirect, ce qui entraîne une augmentat ion de la
pile à chaque appel qui entraînera un nouvel appel avec une nouvell e
augmentation de la pile et ainsi de suite jusqu'au dénouement fatale.
- une taille de l'ensemble des variables automatiques très importante s,
comme une structure contenant des millions de int passé par valeur à
plusieurs méthodes successivement. Cette hypothèse est peu plausibl e avec
les langages .NET qui utilisent énormément les références sur d es objets
contrairement au C avec ses tableaux.
Tout cela ne sont que des généralités mais il faut bien être co nscient de la
situation, qui est pour le moins critique et hostile.
Si mes lieux communs ont été suffisamment clairs, le fait d'appeler une
méthode comme MessageBox qui utilise des variables automatiques (au m oins
pour ses paramètres) quand une StackOverFlow est lancée sera aussi saugrenue
que de faire un new pendant le traitement d'une exception de type
OutOfMemory ;-).
Si l'image te frappe, tu comprendra que tu ne verra pas de MessageBox c ar tu
as subis une StackOverFlowException pendant le traitement de la premiè re
exception (c'est un throw dans un catch).
Il ne reste donc qu'a rusé pour voir le problème avant que la pile soit
pleine car après, c'est Tchernobyl dans la mémoire, même le déb uggeur y perd
ses petits car le contenue de la stack a de fortes chances d'être cor rompu.
Alors, petit padawan, depuis des temps qui datent de bien avant l'exist ence
des premiers débuggeurs, de vaillants programmeurs, seulement munis d e leur
simples bibliothèques d'entrée-sortie (et même pas laser), ont mi s au point
une technique ultra puissante.
C'est simplement d'afficher sur la console des traces de l'activité d u
programme.
Le printf("coucou") de mon précédent post est une instruction C qui ne fait
qu'afficher "coucou" dans la console du programme à la suite des autr es
affichages. Si dans la console a affiché un "coucou", c'est que nous sommes
passée une fois dans cette instruction, si il y a 2 "coucou", c'est q ue nous
sommes passée deux fois dans cette instruction etc...
Avec .NET, les bibliothèques d'entrées-sorties se sont perfectionné es et
"Debug.Write("coucou")" est l'instruction .NET qui va permettre d'affic her
"coucou" dans la fenêtre "Sortie" ou "Output" de VS.NET, la fenêtre qui est
généralement en bas et qui indique le chargement des assemblies.
<CODE>Debug.WriteLine(i.ToString() + " " +
Tbl.Rows.Length.ToString());</CODE>
dans ta boucle permettra de voir l'évolutions de ces valeurs avant qu e le
drame (l'explosion de la pile) n'arrive.
PS: Voici un exemple du pourquoi il ne faut pas catcher les exceptions quand
on n'est pas capable des les résoudre.
Ne catchez pas à tord et à travers ;-). En catchant Exception, vous pouvez
avoir une OutOfMemoryException et si vous avez pas réservé de la mé moire
pour un traitement d'urgence, vous aurez l'air fin avec votre catch.
Bon, on commence par le début ;-).
StackOverFlow, c'est un dépassement de capacité de la pile.
La pile c'est la zone mémoire qui est utilisé pour stocker les vari ables
automatiques.
Les variables automatiques, c'est les variables que le langages alloue
automatiquement comme les arguments du méthode que tu passe par valeu r ou
les variables locale de type ValueType (in, float, double, struct, etc. ).
Ces variables sont à l'opposé des variables allouées avec un new qui elle
sont stockées dans le tas (heap). Le garbage collector ne s'occupe qu e du
tas.
La gestion de variables automatiques se fait par empilement-dépilemen t.
Quand tu entres dans une méthode, la pile augmente de la taille de te s
variables automatiques (paramètres et variables locales). Quand tu so rs de
la méthode, la pile diminue d'autan qu'elle a augmenté en entrant.
Donc entre l'entrée dans une méthode et sa sortie, la pile a augmen té en
taille. Mais la taille de la pile au moment de la sortie est la même qu'à
son entré dans la méthode.
C'est pareil pour tous les langages, .NET ou pas.
Alors comment une pile peut-elle grandir jusqu'à exploser l'espace qu i lui
était réservé ?
J'en vois deux:
- une récursivité trop profonde, c'est à dire une méthode qui s 'appel elle
même de manière direct ou indirect, ce qui entraîne une augmentat ion de la
pile à chaque appel qui entraînera un nouvel appel avec une nouvell e
augmentation de la pile et ainsi de suite jusqu'au dénouement fatale.
- une taille de l'ensemble des variables automatiques très importante s,
comme une structure contenant des millions de int passé par valeur à
plusieurs méthodes successivement. Cette hypothèse est peu plausibl e avec
les langages .NET qui utilisent énormément les références sur d es objets
contrairement au C avec ses tableaux.
Tout cela ne sont que des généralités mais il faut bien être co nscient de la
situation, qui est pour le moins critique et hostile.
Si mes lieux communs ont été suffisamment clairs, le fait d'appeler une
méthode comme MessageBox qui utilise des variables automatiques (au m oins
pour ses paramètres) quand une StackOverFlow est lancée sera aussi saugrenue
que de faire un new pendant le traitement d'une exception de type
OutOfMemory ;-).
Si l'image te frappe, tu comprendra que tu ne verra pas de MessageBox c ar tu
as subis une StackOverFlowException pendant le traitement de la premiè re
exception (c'est un throw dans un catch).
Il ne reste donc qu'a rusé pour voir le problème avant que la pile soit
pleine car après, c'est Tchernobyl dans la mémoire, même le déb uggeur y perd
ses petits car le contenue de la stack a de fortes chances d'être cor rompu.
Alors, petit padawan, depuis des temps qui datent de bien avant l'exist ence
des premiers débuggeurs, de vaillants programmeurs, seulement munis d e leur
simples bibliothèques d'entrée-sortie (et même pas laser), ont mi s au point
une technique ultra puissante.
C'est simplement d'afficher sur la console des traces de l'activité d u
programme.
Le printf("coucou") de mon précédent post est une instruction C qui ne fait
qu'afficher "coucou" dans la console du programme à la suite des autr es
affichages. Si dans la console a affiché un "coucou", c'est que nous sommes
passée une fois dans cette instruction, si il y a 2 "coucou", c'est q ue nous
sommes passée deux fois dans cette instruction etc...
Avec .NET, les bibliothèques d'entrées-sorties se sont perfectionné es et
"Debug.Write("coucou")" est l'instruction .NET qui va permettre d'affic her
"coucou" dans la fenêtre "Sortie" ou "Output" de VS.NET, la fenêtre qui est
généralement en bas et qui indique le chargement des assemblies.
<CODE>Debug.WriteLine(i.ToString() + " " +
Tbl.Rows.Length.ToString());</CODE>
dans ta boucle permettra de voir l'évolutions de ces valeurs avant qu e le
drame (l'explosion de la pile) n'arrive.
PS: Voici un exemple du pourquoi il ne faut pas catcher les exceptions quand
on n'est pas capable des les résoudre.
Ne catchez pas à tord et à travers ;-). En catchant Exception, vous pouvez
avoir une OutOfMemoryException et si vous avez pas réservé de la mé moire
pour un traitement d'urgence, vous aurez l'air fin avec votre catch.
Je crois que tu as mis le doigt dessus.
C'est du code récursif qui s'auto-appel indirectement.
Le plus simple, ne mettre à jour ta table que si la valeur change.
Je crois que tu as mis le doigt dessus.
C'est du code récursif qui s'auto-appel indirectement.
Le plus simple, ne mettre à jour ta table que si la valeur change.
Je crois que tu as mis le doigt dessus.
C'est du code récursif qui s'auto-appel indirectement.
Le plus simple, ne mettre à jour ta table que si la valeur change.