Bagikan melalui


Pemrosesan Loop Siaga

Banyak aplikasi melakukan pemrosesan panjang "di latar belakang." Terkadang pertimbangan performa menentukan menggunakan multithreading untuk pekerjaan tersebut. Thread melibatkan overhead pengembangan ekstra, sehingga tidak disarankan untuk tugas sederhana seperti pekerjaan idle time yang dilakukan MFC dalam fungsi OnIdle. Artikel ini berfokus pada pemrosesan saat tidak aktif. Untuk informasi selengkapnya tentang multithreading, lihat Topik Multithreading.

Beberapa jenis pemrosesan latar belakang dapat dilakukan dengan tepat selama waktu ketika pengguna tidak berinteraksi dengan aplikasi. Dalam aplikasi yang dikembangkan untuk sistem operasi Microsoft Windows, aplikasi dapat melakukan pemrosesan waktu diam dengan membagi proses panjang menjadi banyak fragmen kecil. Setelah memproses setiap fragmen, aplikasi menghasilkan kontrol eksekusi ke Windows menggunakan perulangan PeekMessage .

Artikel ini menjelaskan dua cara untuk melakukan pemrosesan diam di aplikasi Anda:

  • Menggunakan PeekMessage dalam perulangan pesan utama MFC.

  • Menyematkan perulangan PeekMessage lain di tempat lain dalam aplikasi.

PeekMessage di Perulangan Pesan MFC

Dalam aplikasi yang dikembangkan dengan MFC, perulangan pesan utama di CWinThread kelas berisi perulangan pesan yang memanggil API PeekMessage Win32. Perulangan ini juga memanggil fungsi anggota OnIdle antara pesan CWinThread. Aplikasi dapat memproses pesan dalam waktu diam ini dengan mengesampingkan OnIdle fungsi.

Nota

Run, OnIdle, dan fungsi anggota tertentu lainnya sekarang menjadi anggota kelas CWinThread daripada kelas CWinApp. CWinApp berasal dari CWinThread.

Untuk informasi selengkapnya tentang melakukan pemrosesan diam, lihat OnIdle di Referensi MFC.

PeekMessage Di Tempat Lain di Aplikasi Anda

Metode lain untuk melakukan pemrosesan diam dalam aplikasi melibatkan penyematan perulangan pesan di salah satu fungsi Anda. Perulangan pesan ini sangat mirip dengan perulangan pesan utama MFC, yang ditemukan di CWinThread::Run. Itu berarti perulangan seperti itu dalam aplikasi yang dikembangkan dengan MFC harus melakukan banyak fungsi yang sama dengan perulangan pesan utama. Fragmen kode berikut menunjukkan penulisan perulangan pesan yang kompatibel dengan MFC:

BOOL bDoingBackgroundProcessing = TRUE;
while (bDoingBackgroundProcessing)
{
   MSG msg;
   while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
   {
      if (!AfxGetApp()->PumpMessage())
      {
         bDoingBackgroundProcessing = FALSE;
         ::PostQuitMessage(0);
         break;
      }
   }
   // let MFC do its idle processing
   LONG lIdle = 0;
   while (AfxGetApp()->OnIdle(lIdle++))
      ;
   // Perform some background processing here 
   // using another call to OnIdle
}

Kode ini, disematkan dalam fungsi, berulang selama masih ada pemrosesan menganggur yang harus dilakukan. Dalam perulangan itu, perulangan berlapis berulang kali memanggil PeekMessage. Selama panggilan tersebut mengembalikan nilai bukan nol, perulangan memanggil CWinThread::PumpMessage untuk melakukan terjemahan dan pengiriman pesan normal. Meskipun PumpMessage tidak terdokumentasi, Anda dapat memeriksa kode sumbernya dalam file ThrdCore.Cpp di direktori \atlmfc\src\mfc penginstalan Visual Studio Anda.

Setelah perulangan dalam berakhir, perulangan luar melakukan pemrosesan diam dengan satu atau beberapa panggilan ke OnIdle. Panggilan pertama digunakan untuk keperluan MFC. Anda dapat melakukan panggilan tambahan ke OnIdle untuk melakukan pekerjaan latar belakang yang Anda inginkan.

Untuk informasi selengkapnya tentang melakukan pemrosesan diam, lihat OnIdle di Referensi Pustaka MFC.

Lihat juga

Topik MFC Umum