Compartilhar via


Sondagem para o status do trabalho

Por padrão, um aplicativo deve pesquisar alterações no status de um trabalho. Para capturar alterações no estado do trabalho, chame o método IBackgroundCopyJob::GetState . Para capturar alterações no número de bytes e arquivos transferidos, chame o método IBackgroundCopyJob::GetProgress . Para recuperar informações de progresso na parte de resposta de um trabalho de upload-resposta, chame o método IBackgroundCopyJob2::GetReplyProgress. Para obter um exemplo que usa as informações de progresso, consulte Determinando o progresso de um trabalho.

A enumeração BG_JOB_STATE define os estados de um trabalho e a estrutura BG_JOB_PROGRESS contém informações sobre o número de bytes e arquivos transferidos.

Para usar a sondagem, você precisa criar um mecanismo para iniciar a sondagem. Por exemplo, crie um temporizador ou use um botão "Atualizar" na interface do usuário. No entanto, pode ser mais fácil registrar para notificação de eventos e receber eventos quando o estado ou o progresso for alterado. Para obter informações sobre notificação de eventos, consulte Registrando um retorno de chamada COM.

O exemplo a seguir usa um temporizador para pesquisar o estado de um trabalho. O exemplo assume que o ponteiro da interface IBackgroundCopyJob é válido.

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