Compartilhar via


Como: Gerenciar uma instância de agendador

As instâncias de agendador permitem que você associe diretivas específicas de programação com vários tipos carrega de trabalho.Este tópico contém dois exemplos básicos que mostram como criar e gerenciar uma instância de agendador.

Os exemplos criar os agendadores que usam as diretivas padrões de agendador.Para um exemplo que cria um agendador que usa uma diretiva personalizado, consulte Como: Especificar políticas específicas de agendador.

Para gerenciar um agendador métodos como exemplo em seu aplicativo

  1. Crie um objeto de concurrency::SchedulerPolicy que contém os valores de política para que o agendador usar.

  2. Chame o método de concurrency::CurrentScheduler::Create ou o método de concurrency::Scheduler::Create para criar uma instância de agendador.

    Se você usar o método de Scheduler::Create , chame o método de concurrency::Scheduler::Attach quando você precisa associar o agendador com o contexto atual.

  3. Chame a função de CreateEvent para criar um manipulador a um objeto não sinalizado, automática redefinido do evento.

  4. Passar o identificador para o objeto de evento que você acabou de criar para concurrency::CurrentScheduler::RegisterShutdownEvent o método ou o método de concurrency::Scheduler::RegisterShutdownEvent .Isso registra o evento a ser definido quando o agendador é destruído.

  5. Executar as tarefas que você deseja que o agendador atual para agendar.

  6. Chame o método de concurrency::CurrentScheduler::Detach para desanexar o agendador atual e restaurar o agendador anterior como atual.

    Se você usar o método de Scheduler::Create , chame o método de concurrency::Scheduler::Release para diminuir a contagem de referência de objeto de Scheduler .

  7. Passar para manipular o evento para a função de WaitForSingleObject para esperar o agendador para fechar.

  8. Chame a função de CloseHandle para fechar a alça ao objeto do evento.

Exemplo

O código a seguir mostra duas maneiras para gerenciar uma instância de agendador.Cada exemplo a seguir primeiro usa o agendador padrão para executar uma tarefa que imprime - out o identificador exclusivo de agendador atual.Cada exemplo usa em uma instância de agendador para executar novamente a mesma tarefa.Finalmente, cada exemplo restaura o agendador padrão como atual e executar a tarefa mais uma vez.

O primeiro exemplo usa a classe de concurrency::CurrentScheduler para criar uma instância de agendador e para associá-la com o contexto atual.O segundo exemplo usa a classe de concurrency::Scheduler para executar a mesma tarefa.Normalmente, a classe de CurrentScheduler é usada para trabalhar com o agendador atual.O segundo exemplo, usando a classe de Scheduler , é útil quando você deseja controlar quando o agendador está associado com o contexto atual ou quando você deseja associar agendadores específicos com as tarefas específicas.

// 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();
}

O exemplo produz a seguinte saída.

  
  
  
  
  
  
  
  

Compilando o código

Copie o código de exemplo e cole-o em um projeto do Visual Studio, ou cole em um arquivo denominado scheduler-instance.cpp e execute o seguinte comando em uma janela de prompt de comando do Visual Studio.

cl.exe /EHsc scheduler-instance.cpp

Consulte também

Tarefas

Como: Especificar políticas específicas de agendador

Conceitos

Instâncias de agendador