none
Зависает программа во время отрисовки динамически созданного GUI RRS feed

  • Вопрос

  • Отрисовка графического интерфейса, созданного в конструкторе, происходит мгновенно. Но если все те же элементы создаются динамически, программа подвисает в процессе их прорисовки, даже в шапке добавляется подпись - (Не отвечает).

    Возможно ли это избежать и отчего вообще такой диссонанс?

Ответы

  • Спасибо, Vitaly, но установка AutoSize влияния не оказала. Пришлось очень внимательлно заниматься пошаговой отладкой и обнаружился очень интересный нюанс.

     В процедуре создания полей ввода работает цикл создания TextBox'ов. Цикл по числу запрошенных блоков. В конце каждой итерации стоит Me.Controls.Add() после выполнения которой элемент тут же отображается на форме, и к моменту завершения работы процедуры все текстовые поля уже присутствуют на форме. Но совершенно иначе обстоит дело с метками. Так же есть процедура, в ней цикл создания меток по числу запрошенных блоков, в конце каждой итерации стоит команда Me.Controls.Add(), но метки начинают рисоваться на форме лишь когда осуществляется выход из процедуры! А таких процедур у меня три, потому-что меток в блоке три и все разные, у каждой свои своиства и вдобавок вызова процедур я объединял в общую процедуру Create(), и метки начинали отображаться даже не после выхода из своих процедур создания, а после выхода из общей процедуры Create().

    От такого решения пришлось отказаться. Теперь после выполнения каждой из трех процедур делается  принудительный выход из Create() и снова возвращение в нее для выполнения очередной процедуры создания меток.

    Только так прекратились зависания и в разы сократилось время, затрачиваемое на ожидание завершения отрисовки.

    • Помечено в качестве ответа Farsis 17 мая 2011 г. 6:24

Все ответы

  • Придется отлаживаться по шагам. На каком именно элементе происходит зависание? ИМХО очень похоже на deadlock в потоке. Вы используете только стандартные элементы .NET?
  • Вы используете только стандартные элементы .NET?

    Самые что нинаесть.

    Программа создает и отображает блоки. Каждый блок это группа: TextBox Label_1 Label_2 Label_3, т.е. поле ввода и три метки. Получается следующее: text x1+. Блоки создаются в количестве, запрошенном пользователем.

    Так вот, если число блоков превышает 20, отрисовка меток останавливается и в шапке появляется (Не отвечает). А через 10-15 секунд происходит их мгновенное отображение . Соответственно чем больше блоков, тем больше время ожидания с вышеуказанной надписью в шапке.

    Но, когда я создаю в конструкторе 40! таких блоков, их отображение во время запуска программы - доли секунды!

    Пошаговая отладка динамического построения идет без запинок, но отображение Label'ов сильно запаздывает: функции из создания и добавления в коллекцию Controls'ов уже отработали, а метки рисуются лишь спустя несколько секунд, когда отлаживаются совершенно другие коды!

    Отключил создание всех меток - 100! TextBox'ов рисуются моментально! Следовательно проблема где-то с метками. Точнее, с их отрисовкой. Но где и в чем?


  • Попробуйте установить свойство всех Label AutoSizeMode в None сразу после создания. Теоритически это должно положительно сказаться на производительности.
  • Уважаемый пользователь, пожалуйста, не забудьте отметить ответ или ответы, решающие проблему. Для этого под каждым сообщением есть кнопка 'Пометить как ответ'. Спасибо.


    Для связи [mail]
  • Спасибо, Vitaly, но установка AutoSize влияния не оказала. Пришлось очень внимательлно заниматься пошаговой отладкой и обнаружился очень интересный нюанс.

     В процедуре создания полей ввода работает цикл создания TextBox'ов. Цикл по числу запрошенных блоков. В конце каждой итерации стоит Me.Controls.Add() после выполнения которой элемент тут же отображается на форме, и к моменту завершения работы процедуры все текстовые поля уже присутствуют на форме. Но совершенно иначе обстоит дело с метками. Так же есть процедура, в ней цикл создания меток по числу запрошенных блоков, в конце каждой итерации стоит команда Me.Controls.Add(), но метки начинают рисоваться на форме лишь когда осуществляется выход из процедуры! А таких процедур у меня три, потому-что меток в блоке три и все разные, у каждой свои своиства и вдобавок вызова процедур я объединял в общую процедуру Create(), и метки начинали отображаться даже не после выхода из своих процедур создания, а после выхода из общей процедуры Create().

    От такого решения пришлось отказаться. Теперь после выполнения каждой из трех процедур делается  принудительный выход из Create() и снова возвращение в нее для выполнения очередной процедуры создания меток.

    Только так прекратились зависания и в разы сократилось время, затрачиваемое на ожидание завершения отрисовки.

    • Помечено в качестве ответа Farsis 17 мая 2011 г. 6:24