Udostępnij za pośrednictwem


Jak: Zarządzanie wystąpienie harmonogram

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

Przykłady tworzenia planiści, które używają zasad harmonogram domyślny.Na przykład, że tworzy harmonogram używa niestandardowych zasad, zobacz Jak: określić szczególne zasady harmonogram.

Aby zarządzać wystąpienie harmonogram w aplikacji

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

  2. Wywołanie concurrency::CurrentScheduler::Create metody lub concurrency::Scheduler::Create metodę, aby utworzyć wystąpienie harmonogram.

    Jeśli korzystasz z Scheduler::Create metody, wywołanie concurrency::Scheduler::Attach metodę, gdy trzeba skojarzyć harmonogram z bieżącego kontekstu.

  3. Wywołanie CreateEvent funkcja tworzenia uchwytu do obiektu-zasygnalizowane, automatyczne resetowanie zdarzenia.

  4. Przekazać uchwyt do obiektu zdarzenia utworzony do concurrency::CurrentScheduler::RegisterShutdownEvent metody lub concurrency::Scheduler::RegisterShutdownEvent metody.To rejestruje zdarzenia, aby ustawić, kiedy niszczony jest harmonogramu.

  5. Wykonywanie zadań, które mają bieżący harmonogram, aby zaplanować.

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

    Jeśli korzystasz z Scheduler::Create metody, wywołanie concurrency::Scheduler::Release metodę, aby zmniejszyć liczbę odwołań z Scheduler obiektu.

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

  8. Wywołanie CloseHandle funkcji, aby zamknąć uchwyt do obiektu zdarzenia.

Przykład

Poniższy kod ilustruje dwa sposoby zarządzania wystąpienie harmonogram.Każdy harmonogram domyślny są najpierw przykładzie do zadań drukowania identyfikator unikatowy bieżącego harmonogramu.Każde wystąpienie harmonogram są następnie przykładzie wykonywanie tego samego zadania.Wreszcie każdy przykład przywraca harmonogram domyślny jako bieżący i wykonuje zadania jeszcze raz.

W pierwszym przykładzie concurrency::CurrentScheduler klasy, aby utworzyć wystąpienie harmonogram i skojarzyć ją z bieżącego kontekstu.W drugim przykładzie użyto concurrency::Scheduler klasy do wykonania tego samego zadania.Zazwyczaj CurrentScheduler klasa jest używana do pracy z bieżącego harmonogramu.Drugim przykładzie używa Scheduler klasy, jest przydatne, gdy chcesz kontrolować, kiedy harmonogramu jest skojarzony z bieżącego kontekstu lub jeśli chcesz skojarzyć określone planiści 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.

Using CurrentScheduler class...

Current scheduler id: 0
Creating and attaching scheduler...
Current scheduler id: 1
Detaching scheduler...
Current scheduler id: 0


Using Scheduler class...

Current scheduler id: 0
Creating scheduler...
Attaching scheduler...
Current scheduler id: 2
Detaching scheduler...
Current scheduler id: 0

Kompilowanie kodu

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

cl.exe /EHsc scheduler-instance.cpp

Zobacz też

Zadania

Jak: określić szczególne zasady harmonogram

Koncepcje

Harmonogram wystąpień