Bagikan melalui


Polling untuk Status Pekerjaan

Secara default, aplikasi harus melakukan polling untuk perubahan status pekerjaan. Untuk mengambil perubahan dalam status pekerjaan, panggil metode IBackgroundCopyJob::GetState. Untuk menangkap perubahan jumlah byte dan file yang ditransfer, panggil metode IBackgroundCopyJob::GetProgress. Untuk mengambil informasi kemajuan tentang bagian balasan dari pekerjaan balasan unggahan, panggil metode IBackgroundCopyJob2::GetReplyProgress. Untuk contoh yang menggunakan informasi kemajuan, lihat Menentukan Kemajuan Pekerjaan.

Enumerasi BG_JOB_STATE mendefinisikan status pekerjaan, dan struktur BG_JOB_PROGRESS berisi informasi tentang jumlah byte dan file yang ditransfer.

Untuk menggunakan polling, Anda perlu membuat mekanisme untuk memulai polling. Misalnya, buat timer atau gunakan tombol "Perbarui" pada antarmuka pengguna. Namun, mungkin lebih mudah untuk mendaftar pemberitahuan peristiwa dan menerima peristiwa ketika status atau kemajuan berubah. Untuk informasi tentang pemberitahuan peristiwa, lihat Mendaftarkan Panggilan Balik COM.

Contoh berikut menggunakan timer untuk melakukan polling untuk status pekerjaan. Contoh mengasumsikan penunjuk antarmuka IBackgroundCopyJob valid.

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