Необработанное исключение типа "System.StackOverflowException"

WPF
  1. 6 года назад

    Здравствуйте!
    Программа при дебаге выдает ошибки:
    Необработанное исключение типа "System.StackOverflowException" в WindowsBase.dll
    Необработанное исключение типа "System.StackOverflowException" в PresentationFramework.dll
    Прошу Вашей помощи. Программа для курсового проекта, скоро уже сдавать, а тут при тестировании вот такая ошибка.
    В общем ошибка мне ясна, но не знаю как ее избежать.
    Дело в том что в программе я записываю журнал событий. Одно событие - 5-10 параграфов. Событий может быть произвольное количество.
    Вот мой код заполнения журнала:
    XAML

    <GroupBox Name="journalBox" MinWidth="300" Header="Журнал событий" Grid.Row="0" Grid.Column="1" FontSize="12" Margin="5,0,0,0" ScrollViewer.CanContentScroll="True">
    <FlowDocumentReader Height="300" HorizontalAlignment="Left" FontFamily="Tahoma" Zoom="90" MinZoom="60" MaxZoom="200">
    <FlowDocument Name="flowDoc" Focusable="False" TextAlignment="Left" />
    </FlowDocumentReader>
    </GroupBox>

    C#

    if (isNewEvent) {
    	Bold b = new Bold(new Run(txt));//обычно ругается здесь
    	b.FontSize = 14;
    	Paragraph p = new Paragraph(b);
    	p.Foreground = Brushes.White;
    	p.LineHeight = 14;
    	p.Margin = new Thickness(0, 0, 0, 0);
    	p.Padding = new Thickness(0, 0, 0, 0);
    	flowDoc.Blocks.Add(p);
    } else {
    	Paragraph p2 = new Paragraph(new Run(txt));
    	p2.Foreground = Brushes.LightGray;
    	p2.LineHeight = 12;
    	p2.LineHeight = 12;
    	p2.Margin = new Thickness(0, 0, 0, 0);
    	p2.Padding = new Thickness(0, 0, 0, 0);
    	flowDoc.Blocks.Add(p2);
    }
  2. Код не полный!

    import BabkaVanga

    О так яснее стало... наверное используете рекурсию. Вложенность рекурсии не беспредельна. Переполнили стек. Ограничение по моиму можно снять но не советую. Все равно рано или поздно упретесь в оперативную память(объем). Предлагаю пересмотреть вам ваш код и попробовать минимизировать рекурсивные вызовы. Вполне возможно ошиблись и создали бесконечную рекурсию.

  3. Добавлено 6 года назад coder

    Действительно это далеко не полный код....
    Вообще программа называется "Построение модели простейшей системы массового обслуживания"
    так вот когда я ввожу :

    • условие остановки модели - по количеству заявок
    • количество заявок 300

    И отключаю ведение журнала, то отладчик ругается что у меня бесконечная рекурсия...
    Я пересмотрел код другого варианта решения задачи у меня нет.
    Посоветуйте пожалуйста как можно решить.
    Вот ссылка на полный проект VisualStudio 2012: http://sdrv.ms/XFMrFc

  4. Ну да я про тоже, бесконечная рекурсия. Я на работе так что разбираться мне сейчас не с руки, да и 2012 студия только дома сеня поставлю. у меня такое впечатление что ты из RequestHandling хотел сделать "демона", я реально не вижу конца этой рекурсии. Если ты знаешь что в тесте у тебя 300 заявок, для отладки введи переменную счетчик и поставь breakstop по условию достижения этой переменной числа 300 и смотри почему у тебя рекурсия не заканчивается. Проблема в RequestHandling а не в AddToJournal.

  5. Если пользователь вводит 300 заявок, это не значит что RequestHandling выполнится 300 раз.
    RequestHandling - обрабатывает события (поступление заявки или окончание заявки), т.е. если вводим 300 заявок, то RequestHandling выполнится примерно 500 раз.
    В RequestHandling'е вызывается функция EndProcess(), в которой проверяется нужно ли завершить процесс моделирования. Но в этой функции проблем я не вижу...она же прекрасно работает когда вводим 100 или 200.
    Кстати, еще 1 вопрос. Когда нажимаем кнопку начать, сворачивается Expander с формой, и показывается Expander результата. Но у меня между ними есть ProgressBar, который вообще не отображается никогда, а мне надо свернуть Expander с формой, потом минимум секунд 5 показать ProgressBar и потом уже при завершении процесса показать Expander результата.
    Вот кусочек кода, тут я хоу сделать паузу пока не свернется ParamsExpander, но System.Threading.Thread.Sleep не помогло..

    View.ParamsExpander.IsEnabled = false;
    View.ParamsExpander.IsExpanded = false;
    View.StatusBar.IsEnabled = true;
    View.StatusBar.Visibility = Visibility.Visible;
    System.Threading.Thread.Sleep(2000);
  6. Иными словами как подождать пока Expander свернется (там анимация небольшая), потом продолжить выполнение программы...

  7. Добавлено 6 года назад RusNekromant

    View.ParamsExpander.IsEnabled = false;
    View.ParamsExpander.IsExpanded = false;
    View.StatusBar.IsEnabled = true;
    View.StatusBar.Visibility = Visibility.Visible;
    System.Threading.Thread.Sleep(2000);

    Объясняю что ты делаешь. Ты сворачиваешь два экспендера, потом включаешь прогресс бар (наверное на режиме ожидания завершения) потом делаешь его видимым. И потом основной тред тормозишь 2сек. То есть ты на 2 секунды подвешиваешь все что есть у тебя в программе. Прогресс бар выполняться не будет, всмысле анимации не будет никакой. Тебе нужен таймер и метод который продолжит выполнение типа GoTo ну например схематично.

    private sub ОсновнойМетод ()
    View.ParamsExpander.IsExpanded = false;
    View.StatusBar.IsEnabled = true;
    View.StatusBar.Visibility = Visibility.Visible;
    таймер.start()
    --//-- тут было продолжение которое вынесли в отдельный метод
    end sub 
    
    private sub ПродолжениеОсновногоМетода ()
    --//-- 
    end sub
    
    private sub таймер_tisk()
    if таймер.value > 2000 then 
    ПродолжениеОсновногоМетода
    таймер.stop
    end if
    end sub

    За код не бить, по памяти писал. Чисто что бы объяснить свою мысль.

  8. Вот тут про переполнение стека. Ты там массивы используешь? ну почитай может это твоя проблемма http://www.cyberforum.ru/visual-cpp/thread30685.html а если не твоя то по дебагеру проверь, сколько раз код выполняется до переполнения стека.

или зарегистрируйтесь чтобы ответить