Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > DataGridView, тормозит отображение на другом компе


Автор: Hobotanius 8.12.2009, 23:20
Суть вот в чём - я написал приложение с использованием трёх DataGridView и трёх закладок Tab-контрола. В DataGridView загружаю данные из БД. И на моём ноутбуке под вистой и на стационарном компе под XP Pro sp3 (лицензионка) Всё работает отлично с нормальной скоростью. Вчера поставил прогу заказчице на ноутбук Lenovo IdeaPad Y510. На ноутбуке был свежеустановленный зверь-сервиспак три, я доустановил SQLExpress 2005, развернул БД. Запускаю свою прогу - и о ужос! DataGridView как скатерть самобранка, как скрученый половичёк - раскатывает строки сверху вниз! Заказчица - счастлива, а я в шоке! Мне очень леново от таких скоростей работы грида! Сегодня впервые за последний месяц я думал всю ночь в сталкера над этой проблемой. На утро пришла одна мысль - поставить директикс, я поставил, но всё бестолку - скорость осталась прежней. 
Кто-нибудь подскажите, что мне делать чтоб успокоить мою душу быстрой работой грида?! Я знаю, что на этом ноуте муж заказчицы играл в фоллаут третий! А тут грид несчастных тридцать строчек выводит с таким тормозом! Неужели я зря изучал C#?
Жду ваших советов!

Автор: Экскалупатор 9.12.2009, 00:09
Hobotanius, наверное, надо посмотреть что именно ты там сделал.

Автор: Hobotanius 9.12.2009, 01:53
Хм. Это запрсто. Правда очень сомниваюсь, что это чем-то поможет. Т.к, на моём компе и на втором моём компе всё работает очень хорошо. Поэтому мне думается что дело не в коде и не в скорости работы с БД. Потому как еслиб в скорости обмена с бд, то должно было бы по идее быть сначало долгое ожидание, а затем быстрый выброс строк в грид. А тут именно - "раскручивание половичка"...

Код


// Инициализация/обновление грида контент ***
        private void InitGridContent()
        {
            // Сохраним позицию курсора если таковая имела место быть
            if ((this.gridContent.CurrentCellAddress.Y) != -1)
            {
                if (gridContent.RowCount > 0)
                {
                    CursorIndexContent = gridContent.CurrentRow.Index;
                }
            }

            string source = Properties.Settings.Default.ConnectDatabaseString;

            string select_operation = "select * from [dbo].[view_Goods]";

            if (this.radioActivatedContent.Checked == true)
            {
                select_operation = "select * " +
                                   "from [dbo].[view_Goods] " +
                                   "where [dbo].[view_Goods].SoldDate is null " +
                                   "or [dbo].[view_Goods].PayDate is null";
            }

            if (this.radioOnConditionContent.Checked == true)
            {
                this.txtComitent_Content.Text = this.txtComitent_Content.Text.Trim();
                this.txtContractNumber_Content.Text = this.txtContractNumber_Content.Text.Trim();
                this.txtIdGoods_Content.Text = this.txtIdGoods_Content.Text.Trim();
                this.txtAtCostFrom_Content.Text = this.txtAtCostFrom_Content.Text.Trim();
                this.txtAtCostTo_Content.Text = this.txtAtCostTo_Content.Text.Trim();

                String Comitent = this.txtComitent_Content.Text;
                String ContractNumber = this.txtContractNumber_Content.Text;
                String IdGoods = this.txtIdGoods_Content.Text;
                String AtCostFrom = this.txtAtCostFrom_Content.Text;
                String AtCostTo = this.txtAtCostTo_Content.Text;

                Comitent = Comitent + "%";
                if (ContractNumber.Length == 0)
                {
                    ContractNumber = "%";
                }
                if (IdGoods.Length == 0)
                {
                    IdGoods = "%";
                }
                if (AtCostFrom.Length == 0)
                {
                    AtCostFrom = "0";
                }
                if (AtCostTo.Length == 0)
                {
                    AtCostTo = "100000000";
                }

                select_operation = "select * from [dbo].[view_Goods] "+
                    "where [dbo].[view_Goods].[ComitentName] like '" + Comitent + "' " +
                    "and [dbo].[view_Goods].[ContractNumber] like '" + ContractNumber + "' " +
                    "and [dbo].[view_Goods].[id] like '" + IdGoods + "' " +
                    "and [dbo].[view_Goods].[PriceForSale] >= " + AtCostFrom + " " +
                    "and [dbo].[view_Goods].[PriceForSale] <= " + AtCostTo;

                if (checkBOnStatus_Content.Checked == true && comboBoxOnStatus_Content.SelectedIndex > -1)
                {
                    String Status = this.comboBoxOnStatus_Content.SelectedItem.ToString();
                    if (Status == "Продано")
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[SoldDate] is not null";
                    }

                    if (Status == "Выплачено")
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[PayDate] is not null";
                    }

                    if (Status == "Не продано")
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[SoldDate] is null";
                    }

                    if (Status == "Не выплачено")
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[PayDate] is null";
                    }

                    if (Status == "Долг")
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[SoldDate] is not null and [dbo].[view_Goods].[PayDate] is null";
                    }
                }

                if (checkBOnTime_Content.Checked == true && comboBoxOnTime_Content.SelectedIndex > -1 
                   && (checkBDataFrom_Content.Checked == true || checkBDataTill_Content.Checked == true))
                {
                    //MessageBox.Show("","");
                    String OnDate = this.comboBoxOnTime_Content.SelectedItem.ToString();

                    if(OnDate == "Приёма")
                    {
                        OnDate = "Data";
                    }

                    if(OnDate == "Продажи")
                    {
                        OnDate = "SoldDate";
                    }

                    if (OnDate == "Выплаты")
                    {
                        OnDate = "PayDate";
                    }

                    String DataFrom = this.dataTPFrom_Content.Value.Day.ToString() + "." +
                                      this.dataTPFrom_Content.Value.Month.ToString() + "." +
                                      this.dataTPFrom_Content.Value.Year.ToString();

                    String DataTill = this.dataTPTill_Content.Value.Day.ToString() + "." +
                                      this.dataTPTill_Content.Value.Month.ToString() + "." +
                                      this.dataTPTill_Content.Value.Year.ToString();

                    if (this.checkBDataFrom_Content.Checked == true & this.checkBDataTill_Content.Checked == true)
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].["+ OnDate + "] between '" +
                        DataFrom + "' and '" + DataTill + "'";
                    }

                    if (this.checkBDataFrom_Content.Checked == true & this.checkBDataTill_Content.Checked == false)
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].["+ OnDate +"] >= '" +
                        DataFrom + "'";
                    }

                    if (this.checkBDataFrom_Content.Checked == false & this.checkBDataTill_Content.Checked == true)
                    {
                        select_operation = select_operation + " and [dbo].[view_Goods].[" + OnDate + "] <= '" +
                        DataTill + "'";
                    }
                }
            }

            using (SqlConnection conn = new SqlConnection(source))
            {
                conn.Open();

                DataSet ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(select_operation, conn);
                da.Fill(ds, "view_Goods");
                gridContent.AutoGenerateColumns = true;
                gridContent.DataSource = ds;
                gridContent.DataMember = "view_Goods";

                conn.Close();
            }

        }



Вот так инициализируется\обновляется самый нагруженный грид.
Какие есть идеи? От чего может быть РАЗНИЦА в скорости вывода строк в гриде на разных компах?

Автор: Экскалупатор 9.12.2009, 03:35
Цитата

if (this.radioActivatedContent.Checked == true)


улыбнуло, зачем это? в смысле зачем сравнивать true с true?
вообще код очень жесткий. индусы обзавидуются. но на мой взгляд ничего криминального, должно работать. может все таки это система виновата? по моим наблюдения сборки (свежеустановленный зверь-сервиспак три) это какой то ###... ни одной нормальной не встречал, постоянно насуют туда какого то г, а народ пользуется.

ммм. а по какому событию ты все это запускаешь?

Автор: Hobotanius 9.12.2009, 06:38
Цитата

улыбнуло, зачем это? в смысле зачем сравнивать true с true?


Когда на c++ пишу, то такого не делаю, а по шарпу книжку такую читал где такой код называли чуть ли не обязательным и наглядным вот как-то и пошло с того момента - уже почти привычка...

Цитата

вообще код очень жесткий. индусы обзавидуются.


Чё значит - жёсткий? В чём именно минус? Почему индусы)))?

Цитата

но на мой взгляд ничего криминального, должно работать.


Дык!!! Ведь всё работает только на моём компе - ноутбуке, стационарном. И я уверен, что на рабочем компе тоже будет работать, потому как подобная, мной написаная прога, работает с нормальной скоростью на моей работе где также стоит зверь сп3! И та прога на работе в ней ваще дофига гридов - порядка 15 - 20 штук.

Цитата

ммм. а по какому событию ты все это запускаешь?


Запускаю это в конструкторе. Вот так:

Код

            // Выводить активные товары
            this.radioActivatedContent.Select();

            bool initContent = true;
            try
            { InitGridContent(); }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Опрерация вызвала исключение.");
                initContent = false;
            }

            if (initContent == true)
            {
                initOneContent = true;
                gridContent.Columns[0].HeaderCell.Value = "Код";
                gridContent.Columns[1].HeaderCell.Value = "Наименование";
                gridContent.Columns[2].HeaderCell.Value = "Цена";
                gridContent.Columns[3].HeaderCell.Value = "Процент";
                gridContent.Columns[4].HeaderCell.Value = "На руки";
                gridContent.Columns[5].HeaderCell.Value = "Прибыль";
                gridContent.Columns[6].HeaderCell.Value = "Принято";
                gridContent.Columns[7].HeaderCell.Value = "Продано";
                gridContent.Columns[8].HeaderCell.Value = "Выплачено";
                gridContent.Columns[9].HeaderCell.Value = "Договор";
                gridContent.Columns[10].HeaderCell.Value = "Комитент";

                gridContent.Columns[0].Width = Properties.Settings.Default.ContentGrid0;
                gridContent.Columns[1].Width = Properties.Settings.Default.ContentGrid1;
                gridContent.Columns[2].Width = Properties.Settings.Default.ContentGrid2;
                gridContent.Columns[3].Width = Properties.Settings.Default.ContentGrid3;
                gridContent.Columns[4].Width = Properties.Settings.Default.ContentGrid4;
                gridContent.Columns[5].Width = Properties.Settings.Default.ContentGrid5;
                gridContent.Columns[6].Width = Properties.Settings.Default.ContentGrid6;
                gridContent.Columns[7].Width = Properties.Settings.Default.ContentGrid7;
                gridContent.Columns[8].Width = Properties.Settings.Default.ContentGrid8;
                gridContent.Columns[9].Width = Properties.Settings.Default.ContentGrid9;
                gridContent.Columns[10].Width = Properties.Settings.Default.ContentGrid10;

                gridContent.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[5].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                gridContent.Columns[7].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                gridContent.Columns[8].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
                gridContent.Columns[9].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
                gridContent.Columns[10].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft;

                gridContent.Columns[2].DefaultCellStyle.Format = "C";
                gridContent.Columns[4].DefaultCellStyle.Format = "C";
                gridContent.Columns[5].DefaultCellStyle.Format = "C";
                gridContent.Columns[7].DefaultCellStyle.NullValue = "не продано";
                gridContent.Columns[8].DefaultCellStyle.NullValue = "не выплачено";

                gridContent.Columns[1].Frozen = true;
            }


Вызываю при получении главным окном фокуса. Вот так:

Код

// Обновить гриды если базовое окно получает фокус и если гриды уже проходили первую инициализацию
        private void Base_Activated(object sender, EventArgs e)
        {

            ... - такой же код для двух других вкладок.

            if (this.tabControl1.SelectedTab.Text.ToString() == "Товары" &&
                initOneContent == true)
            { 
                InitGridContent();
                SetCursorInGrid(gridContent, CursorIndexContent);
                return;
            }
        }


Вызываю при смене активной вкладки. Вот так:

Код

        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ...- такой же код для двух других вкладок.

            if (this.tabControl1.SelectedTab.Text.ToString() == "Товары" &&
                initOneContent == true)
            {
                InitGridContent();
                SetCursorInGrid(gridContent, CursorIndexContent);
                return;
            }
        }


При добавлении нового товара. Вот так:

Код

// Добавить новый товар
        private void buttonAddNewContent_Click(object sender, EventArgs e)
        {
            DialogResult res = 0;
            for (int i = 0; i < GoodsMaxQuantity; i++)
            {
                AddNewContent NewContent = new AddNewContent("");
                res = NewContent.ShowDialog();

                if (res == DialogResult.OK)
                {
                    InitGridContent();
                }
                else
                {
                    break;
                }
            }
        }


И соответственно при удалении товара.
Вызываю при смене отображения. Вот так:

Код

//Выбор варианта отображения
        private void radioOnConditionContent_CheckedChanged(object sender, EventArgs e)
        {
            this.txtComitent_Content.Enabled = true;
            this.txtContractNumber_Content.Enabled = true;
            this.txtIdGoods_Content.Enabled = true;
            this.txtAtCostFrom_Content.Enabled = true;
            this.txtAtCostTo_Content.Enabled = true;

            this.labelComitent_Content.Enabled = true;
            this.labelContract_Content.Enabled = true;
            this.labelIdGoods_Content.Enabled = true;
            this.labelAtCostFrom_Content.Enabled = true;
            this.labelAtCostTo_Content.Enabled = true;

            this.checkBOnTime_Content.Enabled = true;
            this.checkBOnStatus_Content.Enabled = true;

            if(this.checkBOnTime_Content.Checked == true)
            {
                this.comboBoxOnTime_Content.Enabled = true;

                this.checkBDataFrom_Content.Enabled = true;
                this.checkBDataTill_Content.Enabled = true;

                if (this.checkBDataFrom_Content.Checked == true)
                {
                    this.labelFrom_Content.Enabled = true;
                    this.dataTPFrom_Content.Enabled = true;
                }

                if (this.checkBDataTill_Content.Checked == true)
                {
                    this.labelTill_Content.Enabled = true;
                    this.dataTPTill_Content.Enabled = true;
                }
            }
            else if (this.checkBOnStatus_Content.Checked == true)
            {
                this.comboBoxOnStatus_Content.Enabled = true;
            }

            InitGridContent();
            SetCursorInGrid(gridContent, CursorIndexContent);
        }


Вобщем вызываю каждый раз когда предполагается, что набор строк мог устареть. Пробовал при 100000 записей - на моём компе скорость приемлима - те не более секунды а то и менее.

Заказчица обещала дать ноут на ночь - помучить. Так что первое что сделаю это поставлю родную ему висту и посмотрю работу под ней.

Автор: mrbrooks 9.12.2009, 09:17
Цитата(Hobotanius @  9.12.2009,  06:38 Найти цитируемый пост)
Когда на c++ пишу, то такого не делаю, а по шарпу книжку такую читал где такой код называли чуть ли не обязательным и наглядным вот как-то и пошло с того момента - уже почти привычка...

Тебя обманули.

Цитата(Hobotanius @  9.12.2009,  06:38 Найти цитируемый пост)
Чё значит - жёсткий? В чём именно минус? Почему индусы)))?

Ибо даже так они не пишут  smile 

Hobotanius, короче Склифасовский - фиг с ним кодом. Хотя за такое в 15 веке сжигали на кострах - ибо ересь  smile 
Подозреваю, что небось в Грид ты запихиваешь всю информацию каким нибудь select * from blabla.
 
Цитата(Hobotanius @  9.12.2009,  06:38 Найти цитируемый пост)
Пробовал при 100000 записей

Ооо! Интересно как -  выходит пользователь с удовольствием просмотрит данный результат? А потом когда посмотрит, однозначно будет тебя искать. Возможно с битой  smile 

Проблема одна. А именно в реализации. Не надо возращать сразу 100000 записей - это никому не надо. Выходов здесь два:
1) Менее кошерный. DataGridView.VirtualMode со всеми вытекающими (см. хелп).
2) Более кошерный. Использовать т.н. Paging (причем фильтрование вести не локально храня все в памяти, а sql-запросами - подробнее в гугл. Решения были)

Гуд лак!

Автор: gradvinn 9.12.2009, 09:42
Я бы чем гадать поставил бы временные метки, в тем более если целевой компьютер под рукой. А индуский код здесь не причём, код нормальный.  smile 

Автор: Hobotanius 9.12.2009, 10:37
Цитата(mrbrooks)

Ибо даже так они не пишут  smile


Не люблю пустых слов. Скажи конкретно - в чём минус?

Цитата(mrbrooks)

Hobotanius, короче Склифасовский - фиг с ним кодом. Хотя за такое в 15 веке сжигали на кострах - ибо ересь  smile 
Подозреваю, что небось в Грид ты запихиваешь всю информацию каким нибудь select * from blabla.


Да чё тут подозревать? Смотри мой пост от 9.12.2009, 01:53 там всё написано чё и как я туда пихаю.

Цитата(mrbrooks)

Ооо! Интересно как -  выходит пользователь с удовольствием просмотрит данный результат? А потом когда посмотрит, однозначно будет тебя искать. Возможно с битой  smile


А можно по существу вопроса?

Цитата(mrbrooks)

Проблема одна. А именно в реализации. Не надо возращать сразу 100000 записей - это никому не надо.


Как ни странно, но проблема как раз не в этом - ибо на моём ноутбуке всё летает.

Цитата(mrbrooks)

Выходов здесь два:
1) Менее кошерный. DataGridView.VirtualMode со всеми вытекающими (см. хелп).
2) Более кошерный. Использовать т.н. Paging (причем фильтрование вести не локально храня все в памяти, а sql-запросами - подробнее в гугл. Решения были)


Ну ты меня с первым вариантом уморил ваще! smile Тебе самому не кажется абсурдным на машине, на которой и так крутится SQL-сервер ещё создавать в памяти копию базы данных?
А про Paging поищу конечно хотя явно не сейчас. Я вообще не понимаю чё к коду, то приставать если на МОЕЙ машине всё ЛЕТАЕТ?

Кстате, нашёл тут подобную тему - http://www.sql.ru/forum/actualthread.aspx?bid=34&tid=652032&pg=1
щас читаю, поэтому ещё не знаю чем дело кончится, на чём серце успокоится... Неужели время потраченное на изучение шарпа - потрачено в пустую?

Добавлено через 4 минуты и 58 секунд
Цитата(gradvinn)

Я бы чем гадать поставил бы временные метки, в тем более если целевой компьютер под рукой. А индуский код здесь не причём, код нормальный.  smile


Может есть толковая ссылочка где показано как это делается?

Автор: WarHog 9.12.2009, 11:46
Цитата(Hobotanius @ 9.12.2009,  10:37)
Цитата(mrbrooks)

Выходов здесь два:
1) Менее кошерный. DataGridView.VirtualMode со всеми вытекающими (см. хелп)...


Ну ты меня с первым вариантом уморил ваще! smile Тебе самому не кажется абсурдным на машине, на которой и так крутится SQL-сервер ещё создавать в памяти копию базы данных?

Hobotanius, ты с чего решил, что для работы в Virtual mode нужно создавать в памяти копию базы????
"DataGridView поддерживает специальный виртуальный режим (Virtual mode) отображения данных. Основная идея такого режима заключена в том, что внутри control-а не хранится никаких данных. Вместо этого DataGridView генерирует события, в обработчиках которых программист может «подсунуть» ему данные, или наоборот, получить данные, введенные пользователем." ©

Автор: mrbrooks 9.12.2009, 12:03
Цитата(Hobotanius @  9.12.2009,  10:37 Найти цитируемый пост)
Не люблю пустых слов. Скажи конкретно - в чём минус?

Минус в том что не пишут. Или ты мне предлагаешь перелопатить все то что написал? Ты мне за это заплатишь? Твой код трудно читаем. А так можешь любить, что считаешь нужным. Другим знать это не обязательно.

Цитата(Hobotanius @  9.12.2009,  10:37 Найти цитируемый пост)
А можно по существу вопроса?

Существу чего?

Цитата(Hobotanius @  9.12.2009,  10:37 Найти цитируемый пост)
Как ни странно, но проблема как раз не в этом - ибо на моём ноутбуке всё летает.

В чем проблема? Поставляй свою БД с точно такими же ноутбуками. И вопрос отпадет сам собой.

Цитата(Hobotanius @  9.12.2009,  10:37 Найти цитируемый пост)
Тебе самому не кажется абсурдным на машине, на которой и так крутится SQL-сервер ещё создавать в памяти копию базы данных?

Нет не кажется. Если тебя это забавляет - респект заказчику.

Цитата(Hobotanius @  9.12.2009,  10:37 Найти цитируемый пост)
Кстате, нашёл тут подобную тему

Почитай почитай. На этом же форуме один камрад, как раз стебался над подобной проблемой - мол люди после вопят - "Зачем же я пишу на шарпе! Надо срочно вернуться на плюсы.!".

Цитата(WarHog @  9.12.2009,  11:46 Найти цитируемый пост)
Hobotanius, ты с чего решил, что для работы в Virtual mode нужно создавать в памяти копию базы????

А с чего ты решил что он вообще разбирался в данном вопросе?  smile В данном случае занимаются формошлепством, но ни как не программированием  smile 

Автор: Экскалупатор 9.12.2009, 12:39
мне кажется тут все упрется в железо ноутбука. я писал похожую прогу, где дата грид(правда один) обнавлялся так же, по фокусу, при добавлении и пр. на компе котором писал ему памяти хватало, а когда челу отдал у него все как в слайд шоу, но у него при этом комп древний (целерон 1,5 и 256 ОЗУ) и при таком раскладе я посчитал это нормальным. особенно если учесть все моменты твоего кода(если даже оставить абсолютную нечитаемость) например работы со строками, плюс количество запуска этого (да наверняка и других подобных) методов, среда может просто не успевать за твоей прогой.

Добавлено через 7 минут и 27 секунд
опять же я думаю что такая вещь как "зверь" это вообще смерть для компа, и ставить ее могут только криворукая школота, которая хочет все и сразу, не задумываясь а для чего это все нужно и как это все будет работать вместе. я реально не видел что бы с подобными вещами кто то мог нормально работать. у меня сосед нахваливает, и переустанавливает ее каждую неделю, потому что начинает по его словам "тупить".

Автор: Hobotanius 9.12.2009, 13:15
Цитата(mrbrooks)

Минус в том что не пишут.


Очень полноценное предложение. Я наверное должен быть телепатом чтоб тебя понять.

Цитата(mrbrooks)

Или ты мне предлагаешь перелопатить все то что написал?


Я тебе ни чё не предлагаю.

Цитата(mrbrooks)

Существу чего?


Ты читать внимательно умеешь?

Цитата(mrbrooks)

А с чего ты решил что он вообще разбирался в данном вопросе?  smile В данном случае занимаются формошлепством, но ни как не программированием  smile


Судя по количеству тобой написаных постов - ты круто во всём разбираешься... Только люди хорошо разбирающиеся не пишут в таком тоне. Ты пренериятный собеседник и поэтому мне не нужны твои советы. Видя темы моего авторства - проходи мимо не задерживайся...

Автор: Экскалупатор 9.12.2009, 13:28
Hobotanius, ну так как? конфигурацию целевой машины можешь озвучить?

Автор: mrbrooks 9.12.2009, 13:30
 smile 
Цитата(Hobotanius @  9.12.2009,  13:15 Найти цитируемый пост)
Судя по количеству тобой написаных постов - ты круто во всём разбираешься...

мне до тебя далеко.

Цитата(Hobotanius @  9.12.2009,  13:15 Найти цитируемый пост)
Ты пренериятный собеседник и поэтому мне не нужны твои советы. Видя темы моего авторства - проходи мимо не задерживайся... 

прорвало?  smile  уломал черт языкастый - не буду тебе отвечать.

Автор: Ram1reS 9.12.2009, 14:24
Почитайте про класс StopWatch, и замерьте время выполнения разных участков кода на буке заказчика, будет яснее где конкретно проблема.

Автор: Hobotanius 9.12.2009, 18:46
Цитата(WarHog)

Hobotanius, ты с чего решил, что для работы в Virtual mode нужно создавать в памяти копию базы????
"DataGridView поддерживает специальный виртуальный режим (Virtual mode) отображения данных. Основная идея такого режима заключена в том, что внутри control-а не хранится никаких данных. Вместо этого DataGridView генерирует события, в обработчиках которых программист может «подсунуть» ему данные, или наоборот, получить данные, введенные пользователем." ©


Да видимо я перепутал с другим способом когда результаты выборок хранятся локально в памяти. Спасиб что ткнул носом - читаю.

Цитата(Экскалупатор)

мне кажется тут все упрется в железо ноутбука.


Цитата(Экскалупатор)

Hobotanius, ну так как? конфигурацию целевой машины можешь озвучить?


Озвучиваю - ноутбук Леново
Процессор:                            Intel Core 2 Duo T5450 1.66 ГГц, 2Мб L2 
Чипсет:                            Intel PM965
Оперативная память:    1024Mb DDRII 667МГц, SO-DIMM Hyundai HYMP512S64CP8
Дисплей:    15.4"                WXGA (1280х800) VibrantView (AUO B154EW08) 
Графическая система:    Nvidia Ge Force 8400M GS 128Mb
Жесткий диск:                Hitachi HTS542516K9SA00 160 Гб 5400 об/мин
Оптический привод:                DVD-RW Optiarc AD-7560
Звуковая система:                Realtec ALC888, 4 динамика + сабвуфер, Dolby Home Theatre
Вебкамера:    1.3 Мп
Беспроводные интерфейсы:    Адаптер WiFi Intel PRO/Wireless 3945ABG
Проводные интерфейсы:    Сетевая карта Broadcom NetLink BCM5906M Fast Ethernet 10/100Мбит/с
Факс-модем                             Motorola SM56 56К 

Цитата(Экскалупатор)

опять же я думаю что такая вещь как "зверь" это вообще смерть для компа, и ставить ее могут только криворукая школота, которая хочет все и сразу, не задумываясь а для чего это все нужно и как это все будет работать вместе. я реально не видел что бы с подобными вещами кто то мог нормально работать. у меня сосед нахваливает, и переустанавливает ее каждую неделю, потому что начинает по его словам "тупить".


Ну вот у меня тоже есть такое подозрение, поэтому как только дадут мне целевой бук хочу поставить туда его родную висту и глянуть. Хотя я знаю людей у которых по несколько лет уже стоит зверь и всё нормуль. Да что говорить у меня самого он стоял пока лицензионкой не обзавёлся.


Цитата(Ram1reS)

Почитайте про класс StopWatch, и замерьте время выполнения разных участков кода на буке заказчика, будет яснее где конкретно проблема.


Спасиб, буду читать.

Возможно, что просто дрова для видяхи криво встали...

Автор: Hobotanius 9.12.2009, 19:02
Цитата(Экскалупатор)

среда может просто не успевать за твоей прогой.

Пока что там не за чем неуспевать, сёдня заказчица начала вбивать данные и там на данный момент порядка ста записей всего, а когда я наблюдал тормоза то было всего записей 30 отсилы. И тормоз был независимо от кол-ва записей.

Автор: Экскалупатор 9.12.2009, 19:15
да судя по железу тормозить не должно.
Hobotanius, так я не про количество записей говорил, а про то что получается из твоего кода, постоянно создаются строки, постоянно открываются соединения и пр. а если учесть тот факт что сборщик мусора собирает мусор тогда, когда захочет, то есть мысль что у тебя просто остается много лишнего мусора, на обработку которого требуется определенное количество времени.

Автор: Hobotanius 9.12.2009, 22:33
Вобщем я так понимаю мне необходимо пересмотреть способ работы с гридом. Это ладно. Но всё же это не объясняет почему на одной машине всё нормуль а на другой тормоз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)