Condividi tramite


Procedura: Gestire un'istanza dell'utilità di pianificazione

Le istanze dell'utilità di pianificazione consentono di associare criteri di pianificazione specifici a vari tipi di carichi di lavoro. Questo argomento contiene due esempi di base che illustrano come creare e gestire un'istanza dell'utilità di pianificazione.

Gli esempi creano utilità di pianificazione che usano i criteri dell'utilità di pianificazione predefiniti. Per un esempio che crea un'utilità di pianificazione che usa criteri personalizzati, vedere Procedura: Specificare criteri dell'utilità di pianificazione specifici.

Per gestire un'istanza dell'utilità di pianificazione nell'applicazione

  1. Creare un oggetto concurrency::SchedulerPolicy che contiene i valori dei criteri da usare per l'utilità di pianificazione.

  2. Chiamare il metodo concurrency::CurrentScheduler::Create o il metodo concurrency::Scheduler::Create per creare un'istanza dell'utilità di pianificazione.

    Se si usa il Scheduler::Create metodo , chiamare il metodo concurrency::Scheduler::Attach quando è necessario associare l'utilità di pianificazione al contesto corrente.

  3. Chiamare la funzione CreateEvent per creare un handle a un oggetto evento di reimpostazione automatica non segnalato.

  4. Passare l'handle all'oggetto evento appena creato al metodo concurrency::CurrentScheduler::RegisterShutdownEvent o al metodo concurrency::Scheduler::RegisterShutdownEvent . In questo modo viene registrato l'evento da impostare quando l'utilità di pianificazione viene eliminata definitivamente.

  5. Eseguire le attività da pianificare per l'utilità di pianificazione corrente.

  6. Chiamare il metodo concurrency::CurrentScheduler::D etach per scollegare l'utilità di pianificazione corrente e ripristinare l'utilità di pianificazione precedente come quella corrente.

    Se si usa il Scheduler::Create metodo , chiamare il metodo concurrency::Scheduler::Release per decrementare il conteggio dei riferimenti dell'oggetto Scheduler .

  7. Passare l'handle all'evento alla funzione WaitForSingleObject per attendere l'arresto dell'utilità di pianificazione.

  8. Chiamare la funzione CloseHandle per chiudere l'handle all'oggetto evento.

Esempio

Il codice seguente illustra due modi per gestire un'istanza dell'utilità di pianificazione. Ogni esempio usa innanzitutto l'utilità di pianificazione predefinita per eseguire un'attività che stampa l'identificatore univoco dell'utilità di pianificazione corrente. Ogni esempio usa quindi un'istanza dell'utilità di pianificazione per eseguire di nuovo la stessa attività. Infine, ogni esempio ripristina l'utilità di pianificazione predefinita come quella corrente ed esegue l'attività un'altra volta.

Il primo esempio usa la classe concurrency::CurrentScheduler per creare un'istanza dell'utilità di pianificazione e associarla al contesto corrente. Il secondo esempio usa la classe concurrency::Scheduler per eseguire la stessa attività. In genere, la CurrentScheduler classe viene usata per lavorare con l'utilità di pianificazione corrente. Il secondo esempio, che usa la Scheduler classe , è utile quando si desidera controllare quando l'utilità di pianificazione è associata al contesto corrente o quando si desidera associare utilità di pianificazione specifiche a attività specifiche.

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

Questo esempio produce il seguente output:

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

Compilazione del codice

Copiare il codice di esempio e incollarlo in un progetto di Visual Studio oppure incollarlo in un file denominato scheduler-instance.cpp e quindi eseguire il comando seguente in una finestra del prompt dei comandi di Visual Studio.

cl.exe /EHsc scheduler-instance.cpp

Vedi anche

Istanze dell'utilità di pianificazione
Procedura: Definire criteri dell'utilità di pianificazione specifici