Partager via


Détermination de la progression d’un travail

BITS conserve les informations de progression pour chaque travail. Utilisez les informations de progression pour déterminer le nombre d’octets et de fichiers qui ont été transférés.

Pour récupérer les informations de progression du travail, appelez la méthode IBackgroundCopyJob::GetProgress , comme illustré dans l’exemple suivant. L’exemple suppose que le pointeur d’interface IBackgroundCopyJob est valide.

#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); 
}

Pour récupérer les informations de progression sur la partie réponse d’un travail de réponse de chargement, appelez la méthode IBackgroundCopyJob2::GetReplyProgress , comme illustré dans l’exemple suivant. L’exemple suppose que le pointeur d’interface IBackgroundCopyJob est valide.

#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); 
  }
}

Les fichiers contiennent également des informations sur la progression. Pour récupérer les informations de progression, utilisez la méthode IBackgroundCopyFile::GetProgress . Pour plus d’informations sur la façon de récupérer les fichiers d’un travail, consultez Énumération de fichiers dans un travail.