Bagikan melalui


Pemrosesan Perulangan Menganggur

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

Beberapa jenis pemrosesan latar belakang dilakukan dengan tepat selama interval bahwa 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 OnIdle fungsi anggota antara CWinThread pesan. Aplikasi dapat memproses pesan dalam waktu diam ini dengan mengesampingkan OnIdle fungsi.

Catatan

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, mengulang selama ada pemrosesan diam 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 C++Anda.

Setelah perulangan dalam berakhir, perulangan luar melakukan pemrosesan diam dengan satu atau beberapa panggilan ke OnIdle. Panggilan pertama adalah untuk tujuan MFC. Anda dapat melakukan panggilan tambahan untuk OnIdle melakukan pekerjaan latar belakang Anda sendiri.

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

Baca juga

Topik MFC Umum