lord2sh Ответов: 2

Cwnd::setredraw(TRUE); почему так медленно?


У меня есть управление деревом. проект MFC.

Когда этот элемент управления деревом содержит слишком много элементов дерева (более 310 000 элементов),
всего одна строка - SetRedraw(TRUE);
это слишком медленно. (около 2 секунд)

-----------------------------
m_treeCtrl.SetRedraw(false в);
// ничего не делать
m_treeCtrl.SetRedraw(правда);
-----------------------------

SetRedraw(FALSE) - нет проблем


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

Что я уже пробовал:

m_treeCtrl.SetRedraw(false в);
// ничего не делать
m_treeCtrl.SetRedraw(правда);

KarstenK

повторное рисование 310.000 предметов-не очень хорошая идея. Это не только требует времени, но и отнимает много энергии. :-O

2 Ответов

Рейтинг:
2

Rick York

Мистер Грифф объяснил причины этой проблемы. Иногда это довольно трудно обойти поэтому я использую следующий небольшой класс чтобы помочь :

///////////////////////////////////////////////////////////////////////////////
// This excursion class will lock windows update on construction and
// unlock windows update on destruction.

class LockWinUpdate
{
public:
    LockWinUpdate( CWnd *pw )
    {
        m_pWnd = pw;
        m_pWnd->LockWindowUpdate();
    }

    virtual ~LockWinUpdate()
    {
        m_pWnd->UnlockWindowUpdate();
    }

protected:
    CWnd * m_pWnd { nullptr };
};
Чтобы использовать это, создайте экземпляр, в котором обновления должны быть заблокированы, и установите область действия объекта таким образом, чтобы объект удалялся, когда вы хотите разблокировать обновления. Что-то вроде этого :
{
    LockWinUpdate lockem( this );

    // update the window here

} // object has been destroyed so updates will resume


lord2sh

Огромное спасибо. Я использую SetRedraw(TRUE/FALSE), как вы мне показываете. Но я не знал о функции LockWindowUpdate (). Вместо SetRedraw использование LockWindowUpdate происходит быстрее. это очень быстро и полезно. это работает идеально для меня. Я очень ценю вашу помощь

Рейтинг:
19

OriginalGriff

Потому что установка Redraw в TRUE приводит к тому, что содержимое элемента управления будет повторно оценено и перекрашено.

И если ваш элемент управления деревом содержит более 300 000 элементов, ваш пользовательский интерфейс сильно испорчен. Никогда не представляйте пользователям такое количество раз, практически невозможно найти один элемент, который их интересует, в потоке других вещей. Либо каждый отдельный предмет будет похоронен на 100 ветвей вниз, либо каждая ветвь будет содержать тысячу предметов - и в любом случае найти конкретный предмет очень трудно и отнимает много времени. Это может быть легко для вас сделать код, но это Пита для пользователей, чтобы использовать.

Подумайте об этом: если бы вы пошли на eBay и должны были получить доступ ко всему, что продается через дерево, как быстро вы бы просматривали Amazon вместо этого?

Ваши пользователи возненавидят его, ваше приложение и вас - и я удалю его с крайним предубеждением и потребую вернуть свои деньги PDQ.

Никогда не представляйте более 100 элементов или около того одновременно и предоставляйте параметры фильтрации, поиска и сортировки, чтобы они могли быстро и легко найти то, что им нужно. И это быстрее, чтобы показать, как хорошо!


CPallini

5.

lord2sh

Огромное спасибо. Это мне очень помогло. Мне нужно изменить свое мышление. :)

OriginalGriff

Всегда пожалуйста!