Boşta Çevrim İşleme
Birçok uygulama "arka planda" uzun işleme gerçekleştirir. Bazen performansla ilgili dikkat edilmesi gerekenler, bu tür işler için çoklu iş parçacığı kullanımına neden olur. İş parçacıkları ek geliştirme yükü içerdiğinden, MFC'nin OnIdle işlevinde yaptığı boşta kalma süresi çalışması gibi basit görevler için önerilmez. Bu makale boşta işlemeye odaklanır. Çoklu iş parçacığı kullanımı hakkında daha fazla bilgi için bkz . Çoklu İş Parçacığı Kullanımı Konuları.
Bazı arka plan işleme türleri, kullanıcının uygulamayla başka bir şekilde etkileşim kurmadığı aralıklarda uygun şekilde gerçekleştirilir. Microsoft Windows işletim sistemi için geliştirilen bir uygulamada, bir uygulama uzun bir işlemi birçok küçük parçaya bölerek boşta kalma süresi işleme gerçekleştirebilir. Her parça işlendikten sonra uygulama, PeekMessage döngüsü kullanarak Windows'a yürütme denetimi verir.
Bu makalede, uygulamanızda boşta işlem yapmanın iki yolu açıklanmaktadır:
MFC'nin ana ileti döngüsünde PeekMessage kullanma.
Uygulamanın başka bir yerinde başka bir PeekMessage döngüsü ekleme.
MFC İleti Döngüsünde PeekMessage
MFC ile geliştirilen bir uygulamada, sınıfındaki CWinThread
ana ileti döngüsü PeekMessage Win32 API'sini çağıran bir ileti döngüsü içerir. Bu döngü, iletiler arasında öğesinin OnIdle
CWinThread
üye işlevini de çağırır. Bir uygulama, bu boşta kalma süresinde işlevi geçersiz kılarak OnIdle
iletileri işleyebilir.
Dekont
Run
, OnIdle
ve diğer bazı üye işlevleri artık sınıfı yerine sınıfın CWinThread
CWinApp
üyesidir. CWinApp
, 'den CWinThread
türetilir.
Boşta işleme gerçekleştirme hakkında daha fazla bilgi için MFC Başvurusu'ndaki OnIdle bölümüne bakın.
PeekMessage Uygulamanızın Başka Bir Yerinde
Bir uygulamada boşta işleme gerçekleştirmek için başka bir yöntem, işlevlerinizden birine ileti döngüsü eklemeyi içerir. Bu ileti döngüsü, MFC'nin CWinThread::Run içinde bulunan ana ileti döngüsüne çok benzer. Bu, MFC ile geliştirilen bir uygulamada böyle bir döngünün ana ileti döngüsüyle aynı işlevlerin çoğunu gerçekleştirmesi gerektiği anlamına gelir. Aşağıdaki kod parçası, MFC ile uyumlu bir ileti döngüsü yazmayı gösterir:
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
}
Bir işleve eklenmiş olan bu kod, boşta işlem olduğu sürece döngü yapar. Bu döngü içinde iç içe döngü art arda öğesini çağırır PeekMessage
. Bu çağrı sıfır olmayan bir değer döndürdüğü sürece, döngü normal ileti çevirisi ve gönderimi gerçekleştirmek için çağırır CWinThread::PumpMessage
. Belgelenmemiş olsa PumpMessage
da, kaynak kodunu Visual C++ yüklemenizin \atlmfc\src\mfc dizinindeki ThrdCore.Cpp dosyasında inceleyebilirsiniz.
İç döngü sona erdiğinde, dış döngü bir veya daha fazla çağrısıyla OnIdle
boşta işleme gerçekleştirir. İlk çağrı MFC'nin amaçlarına yöneliktir. Kendi arka plan çalışmanızı yapmak için ek OnIdle
çağrılar yapabilirsiniz.
Boşta işleme gerçekleştirme hakkında daha fazla bilgi için MFC Kitaplık Başvurusu'ndaki OnIdle bölümüne bakın.