MFC UpdateAllViews блокирует или не блокирует?

У меня есть код MFC, основанный на платформе Document View. Я использую UpdateAllViews(nullptr,0,nullptr) из класса Document для вызова функции-члена View OnDraw.

void MyDocumentClass::MyFunction()
{
    //.. Document code to create and process data
    UpdateAllViews(nullptr,0,nullptr) // Invokes OnDraw
    // When does program control reach this line? 
}

Мой вопрос, пожалуйста, скажите мне, является ли функция UpdateAllViews блокирующей или неблокирующей, когда управление программой достигает строки рядом с UpdateAllViews()? Достигнет ли он этого после того, как весь код в OnDraw() завершил выполнение, или достигнет его раньше?

2 ответа

Решение

UpdateAllViews - это неблокирующая функция, которая просто вызывает OnUpdate каждого представления. Функция OnUpdate обычно делает недействительным представление, что позже вызовет OnDraw. UpdateAllViews возвращается после аннулирования и до рисования.

UpdateAllViews - это блокирующая функция, которая просто зацикливает каждое представление и вызывает их функцию OnUpdate. Это не "очередь на потом" и немедленно возвращает вызов как PostMessage.

Как и SendMessage, UpdateAllViews не возвращается до тех пор, пока не будет выполнен весь код в функции OnUpdate каждого представления. Вот почему делать что-то тяжелое, например, напрямую вызывать OnDraw или блокировать ввод-вывод в UpdateAllViews / OnUpdate, обычно плохая идея. Рекомендуется аннулировать некоторые или все представления, основанные на параметрах подсказки, и позволить инфраструктуре вызывать OnDraw для следующего WM_PAINT.

Другие вопросы по тегам