Partilhar via


Como: Gerenciar uma instância do Agendador

Instâncias do Agendador permitem associar políticas específicas de agendamento com vários tipos de cargas de trabalho. Este tópico contém dois exemplos básicos que mostram como criar e gerenciar uma instância do Agendador.

Os exemplos criam agendadores de diretivas de agendador padrão. Para obter um exemplo que cria um agendador que usa uma diretiva personalizada, consulte Como: Especificar políticas específicas do Agendador.

Para gerenciar uma instância do Agendador no seu aplicativo.

  1. Criar um Concurrency::SchedulerPolicy valores de objeto que contém a diretiva para o Agendador usar.

  2. Chamar o Concurrency::CurrentScheduler::Create método ou a Concurrency::Scheduler::Create método para criar uma instância do Agendador.

    Se você usar o Scheduler::Create método, chamada a Concurrency::Scheduler::Attach método quando você precisa associar o Agendador do contexto atual.

  3. Chamar o CreateEvent função para criar um identificador para um objeto de evento de redefinição automática não sinalizado.

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

  5. Execute as tarefas que você deseja que o atual Agendador para agendar.

  6. Chamar o Concurrency::CurrentScheduler::Detach método para desanexar o Agendador atual e restaurar o Agendador anterior como atual.

    Se você usar o Scheduler::Create método, chamada a Concurrency::Scheduler::Release método decrementar a contagem de referência da Scheduler objeto.

  7. Passar o identificador para o evento para o WaitForSingleObject a função para aguardar o Agendador desligar.

  8. Chamar o CloseHandle a função de fechar o identificador para o objeto de evento.

Exemplo

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

O primeiro exemplo usa o Concurrency::CurrentScheduler classe para criar uma instância do Agendador e associá-la ao contexto atual. O segundo exemplo usa o Concurrency::Scheduler classe para executar a mesma tarefa. Normalmente, o CurrentScheduler classe é usada para trabalhar com o Agendador atual. O segundo exemplo usa o Scheduler da classe, é útil quando você desejar controlar quando o Agendador é associado com o contexto atual ou quando você deseja associar agendadores específicos com 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.

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

Compilando o código

Copie o código de exemplo e colá-lo em um Visual Studio do projeto, ou colá-lo em um arquivo que é chamado Agendador instance.cpp e, em seguida, execute o seguinte comando um Visual Studio 2010 janela do Prompt de comando.

cl.exe /EHsc scheduler-instance.cpp

Consulte também

Tarefas

Como: Especificar políticas específicas do Agendador

Outros recursos

Instâncias do Agendador