ジョブ状態のポーリングする
既定では、アプリケーションはジョブの状態の変更をポーリングする必要があります。 ジョブの状態の変更をキャプチャするには、IBackgroundCopyJob::GetState メソッドを呼び出します。 転送されたバイト数とファイル数の変更をキャプチャするには、IBackgroundCopyJob::GetProgress メソッドを呼び出します。 アップロード/応答ジョブの応答部分の進行状況情報を取得するには、IBackgroundCopyJob2::GetReplyProgress メソッドを呼び出します。 進行状況情報を使用する例については、「ジョブの進行状況の決定」を参照してください。
BG_JOB_STATE 列挙型はジョブの状態を定義し、BG_JOB_PROGRESS 構造体には転送されたバイト数とファイル数に関する情報が含まれます。
ポーリングを使用するには、ポーリングを開始するメカニズムを作成する必要があります。 たとえば、タイマーを作成するか、ユーザー インターフェイスで [更新] ボタンを使用します。 ただし、状態または進行状況が変わると、イベント通知に登録してイベントを受信する方が簡単な場合があります。 イベント通知の詳細については、「COM コールバックの登録」を参照してください。
次の例では、タイマーを使用してジョブの状態をポーリングします。 この例では、IBackgroundCopyJob インターフェイス ポインターが有効であると想定しています。
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);