Не устраивает время создания контролов
От: alsot  
Дата: 15.04.10 07:55
Оценка:
Доброго времени суток!
Не устраивает время создания контролов (6 секунд)

tcManualWorkSpace.TabPages.Add("1");
FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
flpManualWorkPlace.Dock = DockStyle.Fill;
tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
ComboBox[] cbIN = new ComboBox[128];
Label [] lIN = new Label [128];
for (int ii = 0; ii < 128; ii++)
{
     lIN[ii] = new Label();
     cbIN[ii] = new ComboBox();
     for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++) 
          cbIN[ii].Items.Add(iii+1);
     lIN[ii].Text = Convert.ToString(ii+1);
     flpManualWorkPlace.Controls.Add(lIN[ii]);
     flpManualWorkPlace.Controls.Add(cbIN[ii]);
}

Каким образом можно уменьшить время создания контролов?

15.04.10 12:38: Перенесено из '.NET'
Re: Не устраивает время создания контролов
От: Lloyd Россия  
Дата: 15.04.10 08:17
Оценка:
Здравствуйте, alsot, Вы писали:

A>Каким образом можно уменьшить время создания контролов?


Добавлять на невидимую панель и потом "включать" панель. Так пробовали?
Re: Не устраивает время создания контролов
От: _FRED_ Черногория
Дата: 15.04.10 08:19
Оценка:
Здравствуйте, alsot, Вы писали:

A>Не устраивает время создания контролов (6 секунд)


Так же имеет смысл показать код, из которого это всё вызывается. Конструктор формы? Обработчик какого-то события?
Help will always be given at Hogwarts to those who ask for it.
Re: Не устраивает время создания контролов
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.04.10 08:23
Оценка: :)))
Здравствуйте, alsot, Вы писали:

A>Доброго времени суток!

A>Не устраивает время создания контролов (6 секунд)

A>
A>tcManualWorkSpace.TabPages.Add("1");
A>FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
A>flpManualWorkPlace.Dock = DockStyle.Fill;
A>tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
A>ComboBox[] cbIN = new ComboBox[128];
A>Label [] lIN = new Label [128];
A>for (int ii = 0; ii < 128; ii++)
A>{
A>     lIN[ii] = new Label();
A>     cbIN[ii] = new ComboBox();
A>     for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++) 
A>          cbIN[ii].Items.Add(iii+1);
A>     lIN[ii].Text = Convert.ToString(ii+1);
A>     flpManualWorkPlace.Controls.Add(lIN[ii]);
A>     flpManualWorkPlace.Controls.Add(cbIN[ii]);
A>}
A>

A>Каким образом можно уменьшить время создания контролов?

Дочитал до второго цикла, где переменная ii и думаю "А если третий вложенный цикл будет — переменную iii назовешь?" Опускаю глаза — смотрю третий цикл и iii =)
Простите, не удержался
Re: Не устраивает время создания контролов
От: notacat  
Дата: 15.04.10 08:47
Оценка:
читать код тяжело.. В общем, попробуйте убедиться в том, что добавление контролов в родительский контрол делается в последнюю очередь. Т.е. создаем что-то мелкое — добавляем в более крупное, и в самом конце уже добавляем вашу flpManualWorkSpace в tcManualWorkSpace. Ну еще, если это WinForms, то поищите как пользоваться SuspendLayout/ResumeLayout, и во всех случаях — ISupportInitialize..
Re[2]: Не устраивает время создания контролов
От: alsot  
Дата: 15.04.10 09:01
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, alsot, Вы писали:


A>>Не устраивает время создания контролов (6 секунд)


_FR>Так же имеет смысл показать код, из которого это всё вызывается. Конструктор формы? Обработчик какого-то события?


Нажатие кнопки
Re[2]: Не устраивает время создания контролов
От: alsot  
Дата: 15.04.10 09:29
Оценка:
Здравствуйте, notacat, Вы писали:

N>читать код тяжело.. В общем, попробуйте убедиться в том, что добавление контролов в родительский контрол делается в последнюю очередь. Т.е. создаем что-то мелкое — добавляем в более крупное, и в самом конце уже добавляем вашу flpManualWorkSpace в tcManualWorkSpace. Ну еще, если это WinForms, то поищите как пользоваться SuspendLayout/ResumeLayout, и во всех случаях — ISupportInitialize..

tcManualWorkSpace.TabPages.Add("1");
FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
flpManualWorkPlace.Dock = DockStyle.Fill;
ComboBox[] cbIN = new ComboBox[128];
Label [] lIN = new Label [128];
this.SuspendLayout();
for (int ii = 0; ii < 128; ii++)
{
     lIN[ii] = new Label();
     cbIN[ii] = new ComboBox();
     for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++) 
          cbIN[ii].Items.Add(iii+1);
     lIN[ii].Text = Convert.ToString(ii+1);
     flpManualWorkPlace.Controls.Add(lIN[ii]);
     flpManualWorkPlace.Controls.Add(cbIN[ii]);
}
tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
this.ResumeLayout();

Вставки SuspendLayout() и ResumeLayout() эффекта не дали.
Re[3]: Не устраивает время создания контролов
От: _FRED_ Черногория
Дата: 15.04.10 09:41
Оценка:
Здравствуйте, alsot, Вы писали:

A>Вставки SuspendLayout() и ResumeLayout() эффекта не дали.


1. Вызвать нужно у всех контейнеров.
2. Привыкайте оборачивать такие вызовы в try/finally.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Не устраивает время создания контролов
От: alsot  
Дата: 15.04.10 10:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, alsot, Вы писали:


A>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали.


_FR>1. Вызвать нужно у всех контейнеров.

_FR>2. Привыкайте оборачивать такие вызовы в try/finally.
Вызвал у всех
строка
tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);

выполняется долго как c суспендом, так и без него.
Какое отношение имеет try/finally к сабжу?
Re[5]: Не устраивает время создания контролов
От: MozgC США http://nightcoder.livejournal.com
Дата: 15.04.10 10:17
Оценка: +1
Здравствуйте, alsot, Вы писали:

A>Какое отношение имеет try/finally к сабжу?


Никакого, просто вам хотят помочь и научить лучше программировать.
Re[5]: Не устраивает время создания контролов
От: notacat  
Дата: 15.04.10 10:18
Оценка:
ЗдравствуйтеA>строка
A>
A>tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
A>

A>выполняется долго как c суспендом, так и без него.

А вы пробовали смотреть на код, который генерит VS, если то же самое делать в дизайнере?
Посмотрите, там наверняка будет так:

1. Создается TabPage
2. В нее что-то добавляется (flpManualWorkPlace)
3. Уже потом эта TabPage добавляется в коллекцию tcManualWorkSpace.TabPages

А у вас все наоборот
Re: Не устраивает время создания контролов
От: Kalina9001  
Дата: 15.04.10 10:22
Оценка: 2 (1) +1
Что то тут не то:
public partial class Form1: Form
{
    private TabControl tabControl;
    public Form1()
    {
        this.InitializeComponent();

        var button = new Button();
        button.Click +=ButtonOnClick;
        button.Dock = DockStyle.Bottom;
        button.Text = "Create Tab";
        this.Controls.Add(button);


        tabControl = new TabControl();
        tabControl.Dock = DockStyle.Fill;
        this.Controls.Add(tabControl);

         
    }

    private void ButtonOnClick(object sender, EventArgs eventArgs)
    {
        var sw = Stopwatch.StartNew();


        var page = new TabPage();
        var panel = new FlowLayoutPanel();
        panel.Dock = DockStyle.Fill;

        const int count = 128;
        Control[] constrols = new Control[2*count];

        for(int i = 0; i < count; i++)
        {
            Label lbl = new Label();
            lbl.Text = "Label" + i;
            constrols[i*2] = lbl;

            ComboBox cb = new ComboBox();
            constrols[i*2+1] = cb;
            
        }
        panel.Controls.AddRange(constrols);
        page.Controls.Add(panel);
        page.Text = sw.Elapsed.ToString();

        tabControl.Controls.Add(page);

        
    }

}


00.00.00.02 (Две сотые секунды)
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re[5]: Не устраивает время создания контролов
От: _FRED_ Черногория
Дата: 15.04.10 10:55
Оценка:
Здравствуйте, alsot, Вы писали:

A>>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали.

_FR>>1. Вызвать нужно у всех контейнеров.
A>выполняется долго как c суспендом, так и без него.

Тогда сначала сделать так
Автор: notacat
Дата: 15.04.10
, и уж если всё равно не поможет, то запустить профайлер, который и покажет узкое место, над которым и надо будет думать.

Кстати, значения SC_r.SC.Optical_switch_List[i].IN в каком диапазоне лежат?

A>Какое отношение имеет try/finally к сабжу?


Тоже, что и имена вроде "SC_r.SC.Optical_switch_List[i].IN", "ii" и "iii".
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Не устраивает время создания контролов
От: alsot  
Дата: 15.04.10 12:03
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, alsot, Вы писали:


A>>>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали.

_FR>>>1. Вызвать нужно у всех контейнеров.
A>>выполняется долго как c суспендом, так и без него.

_FR>Тогда сначала сделать так
Автор: notacat
Дата: 15.04.10
, и уж если всё равно не поможет, то запустить профайлер, который и покажет узкое место, над которым и надо будет думать.


_FR>Кстати, значения SC_r.SC.Optical_switch_List[i].IN в каком диапазоне лежат?


A>>Какое отношение имеет try/finally к сабжу?


_FR>Тоже, что и имена вроде "SC_r.SC.Optical_switch_List[i].IN", "ii" и "iii".


Исправил порядок инициализации контролов. Узкое место —
for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++) 
          cbIN[ii].Items.Add(iii+1);

где SC_r.SC.Optical_switch_List[i].IN = 128
Re[7]: Не устраивает время создания контролов
От: _FRED_ Черногория
Дата: 15.04.10 12:10
Оценка: 2 (1) +2
Здравствуйте, alsot, Вы писали:

_FR>>Кстати, значения SC_r.SC.Optical_switch_List[i].IN в каком диапазоне лежат?


A>Исправил порядок инициализации контролов.


Как я догадываюсь — не помогло?

A>Узкое место -

A>for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++) 
A>          cbIN[ii].Items.Add(iii+1);

A>где SC_r.SC.Optical_switch_List[i].IN = 128

Всё понятно: оба цикла прокручиваются 128 * 128 раз, создаётся 128 * 2 элементов управления, причём в 128 из них по 128 строк. Все эти элементы нужно ещё и отлайоутить, а таблицы лайоута в WinForms — те ещё тормоза. ИМХО, нужно в консерватории что-то править, то есть придумать другой способ отображения информации. Для этого полезно апообщаться в более специализированном форуме Пользовательский интерфейс: проектирование, usability.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.