Udostępnij za pośrednictwem


Porady: zarządzanie przypadkiem planisty

Harmonogram wystąpień pozwalają skojarzyć określone zasady planowania z różnego rodzaju obciążeń.Ten temat zawiera dwa podstawowe przykłady, które pokazują, jak tworzyć i zarządzać wystąpienia harmonogramu.

Przykłady tworzenia pracownikom, które używają zasad harmonogram domyślny.Na przykład, w którym tworzy harmonogram, który używa niestandardowych zasad, zobacz Porady: określanie specjalnych zasad harmonogramu.

Aby zarządzać przypadkiem planisty w aplikacji

  1. Tworzenie concurrency::SchedulerPolicy harmonogram, aby użyć wartości obiekt, który zawiera zasady.

  2. Wywołanie concurrency::CurrentScheduler::Create metoda lub concurrency::Scheduler::Create metoda tworzenia wystąpienia harmonogramu.

    Jeśli używasz Scheduler::Create metoda, call concurrency::Scheduler::Attach metoda, gdy trzeba skojarzyć harmonogram z bieżącego kontekstu.

  3. Wywołanie CreateEvent funkcja służąca do tworzenia dojścia do obiektu zdarzenia-zasygnalizował, auto-reset.

  4. Przekazać dojścia do obiektu zdarzenia, która właśnie została utworzona do concurrency::CurrentScheduler::RegisterShutdownEvent metoda lub concurrency::Scheduler::RegisterShutdownEvent metody.Rejestruje zdarzenie ma być ustalony przy harmonogram jest niszczony.

  5. Wykonywać zadania, które mają bieżący harmonogram do zaplanowania.

  6. Wywołanie concurrency::CurrentScheduler::Detach metoda odłączyć bieżący harmonogram i przywrócić poprzedni harmonogram jako bieżąca.

    Jeśli używasz Scheduler::Create metoda, call concurrency::Scheduler::Release metoda zmniejszyć liczbę odwołań Scheduler obiektu.

  7. Przekazać dojścia do zdarzenia w celu WaitForSingleObject funkcja oczekiwania na harmonogram do zamknięcia.

  8. Wywołanie CloseHandle funkcja zamknąć dojście do obiektu zdarzenia.

Przykład

Poniższy kod przedstawia dwa sposoby zarządzania wystąpienia harmonogramu.Każdy przykład najpierw używa Harmonogram domyślny, aby wykonać zadanie, które drukuje identyfikator unikatowy bieżącego harmonogramu.Każdy przykład używa do wykonania tego samego zadania ponownie wystąpienia harmonogramu.Wreszcie każdy przykład przywraca harmonogram domyślny jako bieżąca i wykonuje to zadanie jeszcze raz.

W pierwszym przykładzie użyto concurrency::CurrentScheduler klasy, aby utworzyć wystąpienia harmonogramu i skojarzyć ją z bieżącego kontekstu.W drugim przykładzie użyto concurrency::Scheduler klasy w celu wykonania tego samego zadania.Zazwyczaj CurrentScheduler klasa jest używana do pracy z bieżącego harmonogramu.Drugi przykład używa Scheduler klasę, jest przydatne, gdy chcesz kontrolować, kiedy harmonogram jest skojarzony z bieżącego kontekstu lub kiedy chcesz skojarzyć określone pracownikom z określonych zadań.

// scheduler-instance.cpp 
// compile with: /EHsc
#include <windows.h>
#include <ppl.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Prints the identifier of the current scheduler to the console. 
void perform_task()
{
   // A task group.
   task_group tasks;

   // Run a task in the group. The current scheduler schedules the task.
   tasks.run_and_wait([] { 
      wcout << L"Current scheduler id: " << CurrentScheduler::Id() << endl;
   });
}

// Uses the CurrentScheduler class to manage a scheduler instance. 
void current_scheduler()
{
   // Run the task. 
   // This prints the identifier of the default scheduler.
   perform_task();

   // For demonstration, create a scheduler object that uses  
   // the default policy values.
   wcout << L"Creating and attaching scheduler..." << endl;
   CurrentScheduler::Create(SchedulerPolicy());

   // Register to be notified when the scheduler shuts down.
   HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
   CurrentScheduler::RegisterShutdownEvent(hShutdownEvent);

   // Run the task again. 
   // This prints the identifier of the new scheduler.
   perform_task();

   // Detach the current scheduler. This restores the previous scheduler 
   // as the current one.
   wcout << L"Detaching scheduler..." << endl;
   CurrentScheduler::Detach();

   // Wait for the scheduler to shut down and destroy itself.
   WaitForSingleObject(hShutdownEvent, INFINITE);

   // Close the event handle.
   CloseHandle(hShutdownEvent);

   // Run the sample task again. 
   // This prints the identifier of the default scheduler.
   perform_task();
}

// Uses the Scheduler class to manage a scheduler instance. 
void explicit_scheduler()
{
   // Run the task. 
   // This prints the identifier of the default scheduler.
   perform_task();

   // For demonstration, create a scheduler object that uses  
   // the default policy values.
   wcout << L"Creating scheduler..." << endl;
   Scheduler* scheduler = Scheduler::Create(SchedulerPolicy());

   // Register to be notified when the scheduler shuts down.
   HANDLE hShutdownEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
   scheduler->RegisterShutdownEvent(hShutdownEvent);

   // Associate the scheduler with the current thread.
   wcout << L"Attaching scheduler..." << endl;
   scheduler->Attach();

   // Run the sample task again. 
   // This prints the identifier of the new scheduler.
   perform_task();

   // Detach the current scheduler. This restores the previous scheduler 
   // as the current one.
   wcout << L"Detaching scheduler..." << endl;
   CurrentScheduler::Detach();

   // Release the final reference to the scheduler. This causes the scheduler 
   // to shut down after all tasks finish.
   scheduler->Release();

   // Wait for the scheduler to shut down and destroy itself.
   WaitForSingleObject(hShutdownEvent, INFINITE);

   // Close the event handle.
   CloseHandle(hShutdownEvent);

   // Run the sample task again. 
   // This prints the identifier of the default scheduler.
   perform_task();
}

int wmain()
{
   // Use the CurrentScheduler class to manage a scheduler instance.
   wcout << L"Using CurrentScheduler class..." << endl << endl;
   current_scheduler();

   wcout << endl << endl;

   // Use the Scheduler class to manage a scheduler instance.
   wcout << L"Using Scheduler class..." << endl << endl;
   explicit_scheduler();
}

Ten przykład generuje następujące wyniki.

  

Kompilowanie kodu

Skopiuj przykładowy kod i wklej go w projekcie programu Visual Studio lub wkleić go w pliku o nazwie Harmonogram instance.cpp , a następnie uruchomić następujące polecenie w oknie wiersza polecenia programu Visual Studio.

cl.exe /EHsc scheduler-instance.cpp

Zobacz też

Zadania

Porady: określanie specjalnych zasad harmonogramu

Koncepcje

Wystąpienia harmonogramu