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.