Sondear el estado del trabajo
De forma predeterminada, una aplicación debe sondear los cambios en el estado de un trabajo. Para capturar los cambios en el estado del trabajo, llame al método IBackgroundCopyJob::GetState . Para capturar los cambios en el número de bytes y archivos transferidos, llame al método IBackgroundCopyJob::GetProgress . Para recuperar información de progreso en la parte de respuesta de un trabajo de carga-respuesta, llame al método IBackgroundCopyJob2::GetReplyProgress . Para obtener un ejemplo que use la información de progreso, vea Determinar el progreso de un trabajo.
La enumeración BG_JOB_STATE define los estados de un trabajo y la estructura BG_JOB_PROGRESS contiene información sobre el número de bytes y archivos transferidos.
Para usar el sondeo, debe crear un mecanismo para iniciar el sondeo. Por ejemplo, cree un temporizador o use un botón "Actualizar" en la interfaz de usuario. Sin embargo, puede ser más fácil registrarse para recibir notificaciones de eventos y recibir eventos cuando cambia el estado o el progreso. Para obtener información sobre la notificación de eventos, consulte Registro de una devolución de llamada COM.
En el ejemplo siguiente se usa un temporizador para sondear el estado de un trabajo. En el ejemplo se supone que el puntero de interfaz IBackgroundCopyJob es 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);