Sustinski, napravio si dve odnosno tri greske.
Prvo par napomena u vezi OnIdle. Valjda znas za sta sluzi ICount parametar; kada program nema nijedan message u svom scheduleru da obradi, pocne da otkucava ICount. Svaki tick radi inkrement ICount varijable za 1. Cim aplikacija procesira samo jednu jedinu poruku (tipa WM_VSCROLL, recimo), ICount se resetuje na 0.
Ovo je vezano za tvoju prvu gresku; naime, kada si napravio svoju preopterecenu funkciju, naravno da treba da pozoves prvo njen nasledjeni kod, pa onda da dodas neko svoje izvrsavanje. Medjutim, ti joj nisi ovde prosledio ICount parametar.
Druga napomena je vezana za drugu gresku; funkcija OnIdle vraca true ili false u odnosu na to da li treba jos vremena da zavrsi svoj background posao (true) ili je zavrsila sa tim pozadinskim poslom (false). Kada si pozvao prvo nasledjenu funkciju, ti uopste nisi proveravao da li je ona gotova ili ne. Ako vrati true, onda nema vremena za izvrsavanje tvoje dodatne pozadinske funkcije (sve se to nize i dodaje).
Tu je i treca greska, koja ne upada toliko u oci -> ti uvek vracas true. Tehnicki, ako tvoja pozadinska funkcija zavrsava posao, slobodno vratis false i ona nece biti ponovo povucena na sledeci OnIdle event.
Dakle, malo izmenjeno, to bi trebalo izgledati otprilike ovako:
[code:1]
BOOL OnIdle(LONG lCount)
{
// prosledi prvo ICount da se izvrse nasledjene obaveze
// te ako one nisu gotove, izadji iz event-handlera
// uz obavezu da se tu vrati tok programa na sledeci OnIdle
if( CWinApp::OnIdle(ICount) )
return TRUE;
// ako je nasledjeno procesiranje gotovo, zovi svoju funkciju
if (nekaFunkcijaZaIzvrsavanjeUPozadini())
return TRUE;
else
return FALSE;
}
[/code:1]
P.S.
Naravno, prepravis svoju funkciju da vraca bool vrednost u zavisnosti da li je gotova ili ne. Vodi racuna da ona ne sme imati neko opseznije izvrsavanje, jer jednostavno za tako nesto nema vremena - kratko i jednostavno, kao i kod interrupt-handlera.