Udostępnij za pośrednictwem


CWinApp::OnIdle

Zastąpienie tej funkcji Członkowskich przeprowadzić przetwarzania w czasie bezczynności.

virtual BOOL OnIdle(
   LONG lCount 
);

Parametry

  • lCount
    Licznik jest zwiększany przy każdym OnIdle jest wywoływane, gdy kolejki wiadomości aplikacji jest pusty.Ten licznik jest zerowany po każdym nową wiadomość jest przetwarzana.Można użyć lCount parametru można określić długość względnego czasu aplikacji jest bezczynny bez przetwarzania wiadomości.

Wartość zwracana

Niezerowa, aby otrzymać więcej bezczynności czas przetwarzania; 0, jeśli potrzeba więcej czasu bezczynności.

Uwagi

OnIdlejest wywoływane w pętli komunikatów domyślne, gdy kolejki wiadomości aplikacji jest pusty.Za pomocą sieci override wywołanie tła własne zadania obsługi bezczynności.

OnIdlepowinien zwracać wartość 0 wskazuje, że bezczynności przetwarzania nie jest wymagane.lCount Parametr jest zwiększany przy każdym OnIdle jest wywoływane, gdy kolejki wiadomość jest pusty i resetuje 0 przy każdym nową wiadomość jest przetwarzana.Można wywołać na różnych procedur bezczynności na podstawie tej liczby.

Poniżej zestawiono przetwarzania pętlę bezczynności:

  1. Jeśli pętli komunikatów w bibliotece Microsoft Foundation klasy sprawdza kolejki wiadomości i nie znajduje się oczekujące wiadomości, wywołuje OnIdle dla obiektu aplikacji i dostaw 0 jako lCount argumentu.

  2. OnIdlewykonuje część przetwarzania i zwraca wartość niezerową, wskazuje, że należy wywołać ponownie do dalszego przetwarzania.

  3. Pętla wiadomości ponownie sprawdza kolejki wiadomości.Jeśli nie ma oczekujących komunikatów, wywołuje OnIdle , zwiększając lCount argumentu.

  4. Ostatecznie OnIdle kończy przetwarzanie wszystkich bezczynnych zadań i zwraca wartość 0.Informuje to pętla wiadomości zaprzestanie wywoływania OnIdle do momentu otrzymania następnej wiadomości z kolejki wiadomości, w którym bezczynny cykl uruchamiany z argumentu równa 0.

Nie należy wykonywać długich zadań podczas OnIdle , ponieważ aplikacja nie może przetworzyć danych wejściowych użytkownika do OnIdle zwraca.

[!UWAGA]

Domyślne wykonania OnIdle aktualizacje polecenia obiektów interfejsu użytkownika, takich jak elementy menu i przyciski paska narzędzi i wykonuje Oczyszczanie struktury danych wewnętrznych.Dlatego jeśli można zastąpić OnIdle, należy wywołać CWinApp::OnIdle z lCount w wersji przesłonięte.Najpierw wywołaj wszystkie klasy base bezczynności przetwarzania (czyli aż do klasy bazowej OnIdle zwraca wartość 0).Jeśli konieczne jest wykonanie prac, przed zakończeniem przetwarzania klasa bazowa, przeglądu wdrożenia klasa bazowa wybierz poprawne lCount podczas którego pracy.

Jeśli nie chcesz OnIdle ma być wywoływana, gdy wiadomość zostanie pobrana z kolejki wiadomości, można zastąpić CWinThreadIsIdleMessage.Jeśli aplikacja ustawił czasomierz bardzo krótkich lub wysyła system WM_SYSTIMER wiadomości, a następnie OnIdle będzie wywoływany cyklicznie i obniżyć wydajność.

Przykład

Dwa poniższe przykłady przedstawiają metody korzystania OnIdle.Pierwszy przykład przetwarza dwóch bezczynnych zadań za pomocą lCount argument priorytety zadań.Pierwszym zadaniem jest wysoki priorytet i zrobić to możliwe.Drugie zadanie jest mniej ważny i należy przeprowadzić tylko wtedy, gdy długa Pauza w danych wejściowych użytkownika.Wywołanie klasy base wersję OnIdle.Drugi przykład zarządza grupa bezczynnego zadania o różnych priorytetach.

BOOL CMyApp::OnIdle(LONG lCount)
{
   BOOL bMore = CWinApp::OnIdle(lCount);

   if (lCount == 0)
   {
      TRACE(_T("App idle for short period of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 10)
   {
      TRACE(_T("App idle for longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 100)
   {
      TRACE(_T("App idle for even longer amount of time\n"));
      bMore = TRUE;
   }
   else if (lCount == 1000)
   {
      TRACE(_T("App idle for quite a long period of time\n"));
      // bMore is not set to TRUE, no longer need idle
      // IMPORTANT: bMore is not set to FALSE since CWinApp::OnIdle may
      // have more idle tasks to complete.
   }

   return bMore;
   // return TRUE as long as there are any more idle tasks
}

Drugi przykład

// In this example, four idle loop tasks are given various 
// opportunities to run:
// Task1 is always given a chance to run during idle time, provided
//   that no message has queued up while the framework was processing
//   its own idle loop tasks (at lCount levels 0 and 1).
// Task2 is given a chance to run only if Task1 has already run,
//   provided that no message has queued up while Task1 was running.
// Task3 and Task4 are given a chance to run only if both Task1 and
//   Task2 have already run, and no message has queued up in the mean
//   time.  If Task3 gets its chance to run, then Task4 always gets
//   a chance to run immediately after Task3.

BOOL CMyWinApp::OnIdle(LONG lCount)
{
   // In this example, as in most applications, you should let the
   // base class CWinApp::OnIdle complete its processing before you
   // attempt any additional idle loop processing.
   if (CWinApp::OnIdle(lCount))
      return TRUE;   

   // The base class CWinApp::OnIdle reserves the lCount values 0 
   // and 1 for the framework's own idle processing.   If you wish to
   // share idle processing time at a peer level with the framework,
   // then replace the above if-statement with a straight call to
   // CWinApp::OnIdle; and then add a case statement for lCount value
   // 0 and/or 1. Study the base class implementation first to 
   // understand how your idle loop tasks will compete with the 
   // framework's idle loop processing.

   switch (lCount)
   {
      case 2:
         Task1();
         return TRUE; // next time give Task2 a chance
      case 3:
         Task2();
         return TRUE; // next time give Task3 and Task4 a chance
      case 4:
         Task3();
         Task4();
         return FALSE; // cycle through the idle loop tasks again
   }
   return TRUE;
}

Wymagania

Nagłówek: afxwin.h

Zobacz też

Informacje

Klasa CWinApp

Wykres hierarchii