none
StackOverflow RRS feed

  • Question

  • Coment augmenter le Stack pour éviter le StackOverflowException lorsque l'on utilise volontairement, et non par erreur bien sûr, une routine recursive de manière importante.

    merci si quelqu'un peut me répondre.

    BRI_67

    vendredi 21 mars 2008 09:51

Réponses

  • Il y a une discussion sur ce sujet avec plusiuers solutions proposées:

    http://forums.microsoft.com/MSDN-FR/ShowPost.aspx?PostID=3016377&SiteID=12

     

    Mais dans le cas d'une simple routine récursive je recommanderai aussi l'utilisation des threads: facilité de mise en oeuvre et souplesse. En plus l'application ne reste pas "gelée" pendant l'exécution de la routine.

     

    vendredi 21 mars 2008 15:44
  • d'abord merci pour votre réponse trés instructive.

    J'avais regardé sur MSDN, mais apparamment ... pas suffisament

    Voici ce que j'ai testé :

    Dans mon module Form1.cs et dans une méthode X :

    MyClass spTest = new MyClass();

    ThreadStart myThreadDelegate = new ThreadStart(MyClass.PgmTest);

    Thread myThread = new Thread(myThreadDelegate,int.MaxValue/4);

    myThread.Start();

    MessageBox.Show("message aprés Start");

     

    Dans le module MyClass :

    namespace xxxxxx

    {

    class MyClass

    {

    .

    .

    public static void PgmTest()

    {

    MessageBox.Show("Test Thread : ça marche", "Test Thread");

    }

    .

    .

    }

    }

    Le test est concluant. ("Test Thread..."  s'affiche, puis "message aprés ..."

    J'ai été obligé de divisé MaxValue par 4 sinon Exception OutOfMemory

    Il me reste un doute :

    Comment être sûr que le Thread lancé est terminé quand on passe à l'instruction suivant myThread.Start();

    Thread.Join est peut-être la solution ?

    Votre avis d'expert m'intéresse, merci d'avance

    BRI_67 

    lundi 24 mars 2008 19:13

Toutes les réponses

  • Bonjour,

    Depuis .Net 2.0, lorsque vous créez un thread vous pouvez spécifier la taille de la stack :

     

    http://msdn2.microsoft.com/en-us/library/ms149581(VS.80).aspx

     

    http://msdn2.microsoft.com/en-us/library/5cykbwz4(VS.80).aspx

     

    Guillaume

    vendredi 21 mars 2008 10:20
  • Il y a une discussion sur ce sujet avec plusiuers solutions proposées:

    http://forums.microsoft.com/MSDN-FR/ShowPost.aspx?PostID=3016377&SiteID=12

     

    Mais dans le cas d'une simple routine récursive je recommanderai aussi l'utilisation des threads: facilité de mise en oeuvre et souplesse. En plus l'application ne reste pas "gelée" pendant l'exécution de la routine.

     

    vendredi 21 mars 2008 15:44
  • d'abord merci pour votre réponse trés instructive.

    J'avais regardé sur MSDN, mais apparamment ... pas suffisament

    Voici ce que j'ai testé :

    Dans mon module Form1.cs et dans une méthode X :

    MyClass spTest = new MyClass();

    ThreadStart myThreadDelegate = new ThreadStart(MyClass.PgmTest);

    Thread myThread = new Thread(myThreadDelegate,int.MaxValue/4);

    myThread.Start();

    MessageBox.Show("message aprés Start");

     

    Dans le module MyClass :

    namespace xxxxxx

    {

    class MyClass

    {

    .

    .

    public static void PgmTest()

    {

    MessageBox.Show("Test Thread : ça marche", "Test Thread");

    }

    .

    .

    }

    }

    Le test est concluant. ("Test Thread..."  s'affiche, puis "message aprés ..."

    J'ai été obligé de divisé MaxValue par 4 sinon Exception OutOfMemory

    Il me reste un doute :

    Comment être sûr que le Thread lancé est terminé quand on passe à l'instruction suivant myThread.Start();

    Thread.Join est peut-être la solution ?

    Votre avis d'expert m'intéresse, merci d'avance

    BRI_67 

    lundi 24 mars 2008 19:13
  • Bonjour,

    Effectivement si vous voulez attendre la fin du thread il faut utiliser la méthode Thread.Joind. Dans votre exemple cela implique l'ajout de la ligne "myThread.Join();" après l'appel à "myThread.Start();".

     

    Guillaume

     

    mardi 25 mars 2008 06:59
  • Désolé de vous interroger directement.

    Le code fonctionne mais ne produit pas le résultat escompté.

    En d'autres terme la routine récurcive provoque un Stack Overflow au bout du même nombre d'itérations récursives ce qui semble vouloir dire que la taille de la pile n'a pas été augmenté et si j'augmente la valeur (int.maxvalue, int.maxvalue/2 etc..) cela provoque une exception OutOfMemory.

    La seule valeur ne provoquant pas OutOfMemory étant int.maxvalue/4

    J'avoue que je sèche !

    Avez vous une idée svp.

    Merci

     

    jeudi 27 mars 2008 09:30