Condividi tramite


Interrogazione dello stato del processo

Per impostazione predefinita, un'applicazione deve verificare regolarmente le modifiche apportate allo stato di un processo. Per acquisire le modifiche nello stato del processo, chiamare il metodo IBackgroundCopyJob::GetState. Per acquisire le modifiche nel numero di byte e file trasferiti, chiamare il metodo IBackgroundCopyJob::GetProgress. Per recuperare informazioni sullo stato di avanzamento nella parte di risposta di un'operazione di caricamento-risposta, invocare il metodo IBackgroundCopyJob2::GetReplyProgress. Per un esempio che usa le informazioni sullo stato di avanzamento, vedere Determinare lo stato di avanzamento di un processo.

L'enumerazione BG_JOB_STATE definisce gli stati di un processo e la struttura BG_JOB_PROGRESS contiene informazioni sul numero di byte e file trasferiti.

Per usare il polling, è necessario creare un meccanismo per avviare il polling. Ad esempio, creare un timer o usare un pulsante "Aggiorna" nell'interfaccia utente. Tuttavia, potrebbe essere più facile registrarsi per la notifica degli eventi e ricevere notifiche quando lo stato o il progresso cambia. Per informazioni sulla notifica degli eventi, vedere Registrazione di un callback COM.

Nell'esempio seguente viene utilizzato un timer per verificare lo stato di un processo. Nell'esempio si presuppone che il puntatore dell'interfacciaIBackgroundCopyJobsia valido.

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