Demonstra Passo a passo: Adaptando o código existente para usar tarefas leves
Este tópico mostra como adaptar o código existente que usa a API do Windows para criar e executar um segmento de uma tarefa simples.
A tarefa leve é uma tarefa que você agendar diretamente de um Concurrency::Scheduler ou Concurrency::ScheduleGroup objeto. Leves tarefas são úteis quando você adaptar o código existente para usar a funcionalidade de agendamento do Runtime de simultaneidade.
Pré-requisitos
Antes de começar este passo a passo, leia o tópico Agendador de tarefas (Runtime de simultaneidade).
Exemplo
Descrição
O exemplo a seguir ilustra o uso típico da API do Windows para criar e executar um segmento. Este exemplo usa a CreateThread a função para chamar o MyThreadFunction em um thread separado.
Código
// windows-threads.cpp
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#define BUF_SIZE 255
DWORD WINAPI MyThreadFunction(LPVOID param);
// Data structure for threads to use.
typedef struct MyData {
int val1;
int val2;
} MYDATA, *PMYDATA;
int _tmain()
{
// Allocate memory for thread data.
PMYDATA pData = (PMYDATA) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL )
{
ExitProcess(2);
}
// Set the values of the thread data.
pData->val1 = 50;
pData->val2 = 100;
// Create the thread to begin execution on its own.
DWORD dwThreadId;
HANDLE hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
pData, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
if (hThread == NULL)
{
ExitProcess(3);
}
// Wait for the thread to finish.
WaitForSingleObject(hThread, INFINITE);
// Close the thread handle and free memory allocation.
CloseHandle(hThread);
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{
PMYDATA pData = (PMYDATA)lpParam;
// Use thread-safe functions to print the parameter values.
TCHAR msgBuf[BUF_SIZE];
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
size_t cchStringSize;
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
DWORD dwChars;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
return 0;
}
Comentários
O exemplo produz a seguinte saída.
Parameters = 50, 100
As etapas a seguir mostram como adaptar o exemplo de código, use o Runtime de simultaneidade para executar a mesma tarefa.
Para adaptar o exemplo de uma tarefa leve
Adicionar um #include a diretiva para o concrt.h de arquivo de cabeçalho.
#include <concrt.h>
Adicionar um using diretiva para o Concurrency namespace.
using namespace Concurrency;
Alterar a declaração do MyThreadFunction para usar o __cdecl convenção de chamada e retornar void.
void __cdecl MyThreadFunction(LPVOID param);
Modificar o MyData estrutura para incluir um Concurrency::event o objeto que sinaliza para o aplicativo principal que a tarefa foi finalizada.
typedef struct MyData { int val1; int val2; event signal; } MYDATA, *PMYDATA;
Substituir a chamada para CreateThread com uma chamada para o Concurrency::CurrentScheduler::ScheduleTask método.
CurrentScheduler::ScheduleTask(MyThreadFunction, pData);
Substituir a chamada para WaitForSingleObject com uma chamada para o Concurrency::event::wait método para aguardar a conclusão da tarefa.
// Wait for the task to finish. pData->signal.wait();
Remover a chamada para CloseHandle.
Alterar a assinatura da definição de MyThreadFunction para coincidir com a etapa 3.
void __cdecl MyThreadFunction(LPVOID lpParam)
No final da MyThreadFunction function, chamar o Concurrency::event::set método para sinalizar para o aplicativo principal que a tarefa foi finalizada.
pData->signal.set();
Remover o return a instrução de MyThreadFunction.
Exemplo
Descrição
O exemplo a seguir concluído mostra o código que usa uma tarefa leve para chamar o MyThreadFunction função.
Código
// migration-lwt.cpp
// compile with: /EHsc
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#include <concrt.h>
using namespace Concurrency;
#define BUF_SIZE 255
void __cdecl MyThreadFunction(LPVOID param);
// Data structure for threads to use.
typedef struct MyData {
int val1;
int val2;
event signal;
} MYDATA, *PMYDATA;
int _tmain()
{
// Allocate memory for thread data.
PMYDATA pData = (PMYDATA) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL )
{
ExitProcess(2);
}
// Set the values of the thread data.
pData->val1 = 50;
pData->val2 = 100;
// Create the thread to begin execution on its own.
CurrentScheduler::ScheduleTask(MyThreadFunction, pData);
// Wait for the task to finish.
pData->signal.wait();
// Free memory allocation.
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
void __cdecl MyThreadFunction(LPVOID lpParam)
{
PMYDATA pData = (PMYDATA)lpParam;
// Use thread-safe functions to print the parameter values.
TCHAR msgBuf[BUF_SIZE];
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
size_t cchStringSize;
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
DWORD dwChars;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
pData->signal.set();
}