На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Программа Windows Forms не отвечает (зависает)
    Через 5 минут после запуска программы из VS2022 в режиме Debug замирает лента памяти на вкладке Средства диагностики (последнее значение памяти 42 мб), при этом индикатор загрузки ЦП работает нормально. Диспетчер задача показывает, что программа использует 8% ЦП и 32 мб памяти. Программа примерно минут 30-40 рисует графики (хотя 2 нижних графика плохо обновляются) и сбрасывает данные в файл нормально. Примерно через час программа зависает и в диспетчере задач появляется надпись "Не отвечает". При этом в диспетчере потребление памяти 55 мб, а загрузка процессора - 18%. Я с помощью средств диагностики ранее нашел причину быстрого роста потребления памяти (забыл удалить точки графика при обновлении графика Points.Clear()), а вот как обнаружить причину зависания - не знаю. В программе использую BackgroundWorker для вывода на одну из вкладок графиков, а на другую вкладку - значений. Помогите, пожалуйста, советом, как найти причину зависания. Программу прикрепил.
    Прикреплённый файлПрикреплённый файлcsFormsTest.zip (14,63 Кбайт, скачиваний: 39)
      Подключи Serilog какой нить, и выводи в лог что происходит.
      Если оно сразу не зависает, а через час зависает - просто вот так сходу сложно сказать в чем проблема. Но зависать прям "Программа не отвечает", может быть из за необработанного исключения, либо из за того что ты каким то образом заблокировал главный поток программы(допустим в обработчике какого то контрола - пошел лупить бесконечный цикл, не отдавая процессорное время ГУИ).
      Все это отслеживается с помощью логов.

      1) Во первых, вынеси из обработчиков формы всю вот эту кашу в отдельный класс, в отдельные методы. Создай хотя бы просто класс Graphics, и в нем методы в которых завязана логика, не относящаяся к гуям вообще, и вызывай эти методы в обработчиках. Так по крайней мере ты разгрузишь обработчики в ГУИ. А то сейчас у тебя там мало того что код формы и контролов, так он еще и смешан с логикой, где всякие значения в циклах вычисляются, и к форме и контролам ну вообще не имеют никакого отношения. Так тебе проще будет читать хотя бы программу, а портянку кода ты изолируешь в отдельном классе(похорошему конечно там все надо переписывать, но хотя бы так.)
      2) Во вторых каждый метод, где у тебя есть тобой написанный код - оберни в try/catch, и во всех catch выводи в лог запись об ошибке, ну или хотя бы брекпоинт поставь.
      У тебя куча кода подозрительного со всякими unsafe(зачем то, ты там что с указателями работаешь?), да и просто куча циклов и все намешано в кучу, и очень вероятно летит исключение, которое ты не обрабатываешь, ибо просто не видишь где оно может потенциально возникнуть.
      3) В третьих - протрейси(в лог выводи) вообще все что можно, ну не просто каждую строчку конечно, а хотя бы что ты делаешь, типа какая функция вызывается, что в ней творится, то будет вызвано, выводи значения в лог, и результаты вычислений от которых зависят дальнейшие вычисления, так же выводи в лог. Вдруг ты проверку где то не вставил, а оно там нулевое.

      Вот после этого - воспроизводи проблему. Как только все зависло, открывай лог - и смотри, где оно встало, какая ошибка случилась. И уже от этого пляши.
      Сообщение отредактировано: Wound -
        Иногда помогает в момент зависания программы в дебаге нажать паузу и программа остановиться на том месте где на данный момент находиться.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0211 ]   [ 18 queries used ]   [ Generated: 27.07.24, 07:40 GMT ]