Как обрабатывать прогресс в BackgroundTransfer DownloadOperation C ++ / WinRT

Я пытаюсь обрабатывать процесс загрузки файла через BackgroundTransfer :: BackgroundDownloader в приложении C ++ / WinRT Windows 10 UWP.

Вчера я читал документацию 10 раз: https://docs.microsoft.com/en-us/uwp/api/windows.foundation.iasyncoperationwithprogress-2.progress?view=winrt-19041#Windows_Foundation_IAsyncOperationWithProgress

BackgroundTransfer::BackgroundDownloader downloader{ BackgroundTransfer::BackgroundDownloader() };
BackgroundTransfer::DownloadOperation download = downloader.CreateDownload(uri, destinationFile);
auto progress = download.StartAsync();

progress.Progress(Windows::Foundation::AsyncOperationProgressHandler<BackgroundTransfer::DownloadOperation, BackgroundTransfer::BackgroundDownloadProgress>(
    [=](Windows::Foundation::IAsyncOperationWithProgress<BackgroundTransfer::DownloadOperation, BackgroundTransfer::DownloadOperation> const sender, BackgroundTransfer::BackgroundDownloadProgress args) {
        int progress_calc = (int)(100 * ((double)args.BytesReceived / (double)args.TotalBytesToReceive));    
    }
));
Progress

но я не могу реализовать это правильно :(

это мой пример кода (файл загружается хорошо, но если я поставил функцию .Progress, я получил ошибку: Error C2280 'void *winrt::Windows::Foundation::IUnknown::operator new(size_t)': attempting to reference a deleted function NativeModuleSample

код:

BackgroundTransfer::BackgroundDownloader downloader{ BackgroundTransfer::BackgroundDownloader() };
BackgroundTransfer::DownloadOperation download = downloader.CreateDownload(uri, destinationFile);
auto progress = download.StartAsync();

progress.Progress(Windows::Foundation::AsyncOperationProgressHandler<BackgroundTransfer::DownloadOperation, BackgroundTransfer::BackgroundDownloadProgress>(
    [=](Windows::Foundation::IAsyncOperationWithProgress<BackgroundTransfer::DownloadOperation, BackgroundTransfer::DownloadOperation> const sender, BackgroundTransfer::BackgroundDownloadProgress args) {
        int progress_calc = (int)(100 * ((double)args.BytesReceived / (double)args.TotalBytesToReceive));    
    }
));

person Pete    schedule 06.10.2020    source источник


Ответы (1)


Чтобы обработать процесс загрузки файла через BackgroundTransfer :: BackroundDownloader, вы можете обратиться к сценарию Scenario1_Download образец в GitHub.

Основываясь на примере загрузки, вы можете изменить свой код progress.Progress(…) на следующий:

progress.Progress(Windows::Foundation::AsyncOperationProgressHandler<Windows::Networking::BackgroundTransfer::DownloadOperation, Windows::Networking::BackgroundTransfer::DownloadOperation>(
    [=](Windows::Foundation::IAsyncOperationWithProgress<Windows::Networking::BackgroundTransfer::DownloadOperation, Windows::Networking::BackgroundTransfer::DownloadOperation> const sender, 
        Windows::Networking::BackgroundTransfer::DownloadOperation args) {
               
            BackgroundDownloadProgress currentProgress = args.Progress();

            UINT64 percent = 0;
            if (currentProgress.TotalBytesToReceive > 0)
            {
                percent =(INT64)((double)currentProgress.BytesReceived * 100 / (double)currentProgress.TotalBytesToReceive);
            }
    }
));
person YanGu    schedule 07.10.2020