Determinando o progresso de um trabalho
O BITS mantém as informações de progresso para cada trabalho. Use as informações de progresso para determinar quantos bytes e arquivos foram transferidos.
Para recuperar informações de progresso para o trabalho, chame o método IBackgroundCopyJob::GetProgress , conforme mostrado no exemplo a seguir. O exemplo assume que o ponteiro da interface IBackgroundCopyJob é válido.
#define PROGRESS_COMPLETE_LEN 50
HRESULT hr;
IBackgroundCopyJob* pJob;
WCHAR szProgressComplete[PROGRESS_COMPLETE_LEN+1];
BG_JOB_PROGRESS Progress;
hr = pJob->GetProgress(&Progress);
if (FAILED(hr))
{
//Handle error
}
//Because the BytesTotal member can be 0 or BG_SIZE_UNKNOWN, you may not be able
//to determine a percentage value to display, such as 57%. It is best to display a
//string that shows the number of bytes transferred. For example, "123456 of
//999999" or "123456 of Unknown".
if (BG_SIZE_UNKNOWN == Progress.BytesTotal)
{
StringCchPrintf(szProgressComplete, PROGRESS_COMPLETE_LEN+1, L"%I64d of Unknown",
Progress.BytesTransferred);
}
else
{
StringCchPrintf(szProgressComplete, PROGRESS_COMPLETE_LEN+1, L"%I64d of %I64d",
Progress.BytesTransferred, Progress.BytesTotal);
}
Para recuperar informações de progresso na parte de resposta de um trabalho de resposta de carregamento, chame o método IBackgroundCopyJob2::GetReplyProgress , conforme mostrado no exemplo a seguir. O exemplo assume que o ponteiro da interface IBackgroundCopyJob é válido.
#define REPLY_COMPLETE_LEN 4
HRESULT hr;
IBackgroundCopyJob* pJob;
IBackgroundCopyJob2* pJob2 = NULL;
WCHAR szReplyComplete[REPLY_COMPLETE_LEN+1];
BG_JOB_REPLY_PROGRESS Progress;
pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
hr = pJob2->GetReplyProgress(&Progress);
if (SUCCEEDED(hr))
{
if (0 == Progress.BytesTotal) //The job type is not BG_JOB_TYPE_UPLOAD_REPLY
{
//Logic to deal with this case
}
else if (BG_SIZE_UNKNOWN == Progress.BytesTotal) //The reply has not begun
{
StringCchPrintf(szReplyComplete, REPLY_COMPLETE_LEN+1, L"0%%");
}
else
{
StringCchPrintf(szReplyComplete, REPLY_COMPLETE_LEN+1 L"%I64d%%",
100*Progress.BytesTransferred/Progress.BytesTotal);
}
}
Os arquivos também contêm informações de progresso. Para recuperar as informações de progresso, use o método IBackgroundCopyFile::GetProgress . Para obter informações sobre como recuperar os arquivos de um trabalho, consulte Enumerando arquivos em um trabalho.