Partager via


Interrogation de l’état du travail

Par défaut, une application doit interroger les modifications apportées au status d’un travail. Pour capturer les modifications apportées à l’état du travail, appelez la méthode IBackgroundCopyJob::GetState . Pour capturer les modifications apportées au nombre d’octets et de fichiers transférés, appelez la méthode IBackgroundCopyJob::GetProgress . Pour récupérer les informations de progression sur la partie réponse d’un travail upload-reply, appelez la méthode IBackgroundCopyJob2::GetReplyProgress . Pour obtenir un exemple qui utilise les informations de progression, consultez Détermination de la progression d’un travail.

L’énumération BG_JOB_STATE définit les états d’un travail, et la structure BG_JOB_PROGRESS contient des informations sur le nombre d’octets et de fichiers transférés.

Pour utiliser l’interrogation, vous devez créer un mécanisme pour lancer l’interrogation. Par exemple, créez un minuteur ou utilisez un bouton « Mettre à jour » sur l’interface utilisateur. Toutefois, il peut être plus facile de s’inscrire à la notification d’événement et de recevoir des événements lorsque l’état ou la progression change. Pour plus d’informations sur la notification d’événement, consultez Inscription d’un rappel COM.

L’exemple suivant utilise un minuteur pour interroger l’état d’un travail. L’exemple suppose que le pointeur d’interface IBackgroundCopyJob est valide.

HRESULT hr;
IBackgroundCopyJob* pJob;
BG_JOB_STATE State;
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
//IBackgroundCopyError* pError = NULL;
//BG_JOB_PROGRESS Progress;
//WCHAR *JobStates[] = { L"Queued", L"Connecting", L"Transferring",
//                       L"Suspended", L"Error", L"Transient Error",
//                       L"Transferred", L"Acknowledged", L"Canceled"
//                     };

liDueTime.QuadPart = -10000000;  //Poll every 1 second
hTimer = CreateWaitableTimer(NULL, FALSE, L"MyTimer");
SetWaitableTimer(hTimer, &liDueTime, 1000, NULL, NULL, 0);

do
{
  WaitForSingleObject(hTimer, INFINITE);

  //Use JobStates[State] to set the window text in a user interface.
  hr = pJob->GetState(&State);
  if (FAILED(hr))
  {
    //Handle error
  }

  if (BG_JOB_STATE_TRANSFERRED == State)
    //Call pJob->Complete(); to acknowledge that the transfer is complete
    //and make the file available to the client.
  else if (BG_JOB_STATE_ERROR == State || BG_JOB_STATE_TRANSIENT_ERROR == State)
    //Call pJob->GetError(&pError); to retrieve an IBackgroundCopyError interface 
    //pointer which you use to determine the cause of the error.
  else if (BG_JOB_STATE_TRANSFERRING == State)
    //Call pJob->GetProgress(&Progress); to determine the number of bytes 
    //and files transferred.
} while (BG_JOB_STATE_TRANSFERRED != State && 
         BG_JOB_STATE_ERROR != State &&
         BG_JOB_STATE_TRANSIENT_ERROR != State);
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);