Реализация IWICBitmapCodecProgressNotification (декодер)
IWICBitmapCodecProgressNotification
Если кодек выполняет операцию ввода-вывода, например copyPixels на большом изображении, может потребоваться несколько секунд или даже минут. Если конечные пользователи не могут прервать длительную операцию, они могут подумать, что приложение зависло. Пользователи часто закрывают приложение или даже перезагружают компьютеры, пытаясь восстановить контроль над компьютером, когда приложение не отвечает.
Этот интерфейс позволяет приложению указать функцию обратного вызова, которую кодек может вызывать через указанные интервалы, чтобы уведомить вызывающего объекта о ходе текущей операции. Приложение может использовать эту функцию обратного вызова для отображения индикатора хода выполнения в пользовательском интерфейсе, чтобы уведомить пользователя о состоянии операции. Если пользователь нажимает кнопку Отмена в диалоговом окне Прогресс, приложение возвращает WINCODEC_ERR_ABORTED из функции обратного вызова. В этом случае кодек должен отменить указанную операцию и передать этот HRESULT обратно вызывающей стороне метода, которая выполняла операцию.
Этот интерфейс должен быть реализован в классе декодировщика на уровне контейнера.
interface IWICBitmapCodecProgressNotification : public IUnknown
{
HRESULT RegisterProgressNotification (
PFNProgressNotification pfnProgressNotification,
LPVOID pvData,
DWORD dwProgressFlags );
}
УведомлениеОРегистрацииПрогресса
RegisterProgressNotification вызывается приложением для регистрации функции обратного вызова, которую кодек может вызывать через указанные интервалы. Первый параметр, pfnProgressNotification, является указателем на функцию обратного вызова, которую кодек должен вызывать через регулярные интервалы.
Параметр pvData указывает на объект, который вызывающий желает, чтобы кодек передавал в функцию обратного вызова при каждом её вызове. Этот объект может быть любым и не имеет особого значения для кодека.
Параметр dwProgressFlags указывает, когда кодек должен вызывать функцию обратного вызова. Функция OR может выполняться с двумя перечислениями для этого параметра. Перечисление WICProgressOperation указывает, следует ли вызывать функцию обратного вызова во время декодирования (WICProgressOperationCopyPixels), кодирования (WICProgressOperationWritePixels) или обоих процессов (WICProgressOperationAll).
enum WICProgressOperation
{
WICProgressOperationCopyPixels,
WICProgerssOperationWritePixels,
WICProgressOperationAll
};
Кодек должен вызывать функцию обратного вызова через регулярные интервалы во время операции, но вызывающий объект может указать определенные требования. Перечисление WICProgressNotification указывает, в какой момент в операции вызвать функцию обратного вызова. Если вызывающий объект указывает WICProgressNotificationBegin, необходимо вызвать его в начале операции (0,0). Если вызывающий объект не указывает это, это необязательно. Аналогичным образом, если вызывающий объект указывает WICProgersSNotificationEnd, необходимо вызвать его при завершении операции (1.0). Если вызывающий объект указывает WICProgressNotificationAll, необходимо вызвать его в начале и конце, а также через регулярные интервалы во время операции. Вызывающий объект также может указать WICProgressNotificationFrequent, что означает, что они хотят, чтобы их снова вызывали через частые интервалы, возможно, после каждых двух строк сканирования. (Вызывающий объект обычно использует этот флаг только для очень большого изображения.) В противном случае обычно следует возвращать обратный вызов через интервалы примерно в 10 процентов приращения общего количества строк сканирования, которые необходимо обработать.
enum WICProgressNotification
{
WICProgressNotificationBegin,
WICProgerssNotificationEnd,
WICProgerssNotificationFrequent,
WICProgressNotificationAll
};
Для определенного декодера или экземпляра кодировщика можно зарегистрировать только одну функцию обратного вызова. Если приложение вызывает RegisterProgressNotification несколько раз, замените ранее зарегистрированную функцию обратного вызова новой. Чтобы отменить регистрацию обратного вызова, вызывающий установит параметр pfnProgressNotification в значение NULL.
УведомлениеОПрогрессеPFN
PFNProgressNotification — это функция обратного вызова со следующей сигнатурой.
typedef HRESULT (*PFNProgressNotification) (
LPVOID pvData,
ULONG uFrameNum,
WICProgressOperation operation,
double dblProgress );
При вызове функции обратного вызова используйте параметр pvData для передачи обратно тех же pvData, которые приложение указало при регистрации функции обратного вызова.
Параметр uFrameNum должен указывать индекс обрабатываемого кадра.
Задайте параметр операции WICProgressOperationCopyPixels при декодировании и WICProgressOperationWritePixels при кодировании.
Параметр dblProgress должен быть числом от 0,0 (начало операции) до 1.0 (завершение операции). Значение должно отражать пропорцию уже обработанных строк сканирования относительно общего количества обработанных строк сканирования.
Связанные разделы
-
Справочник
-
концептуальные