İzlenecek yol: Mevcut Kodu Hafif Görevleri Kullanmaya Uyarlama
Bu konu başlığında, basit bir görev kullanmak üzere bir iş parçacığı oluşturmak ve yürütmek için Windows API'sini kullanan mevcut kodu uyarlama gösterilmektedir.
Basit görev, doğrudan eşzamanlılık::Scheduler veya eşzamanlılık::ScheduleGroup nesnesinden zamanladığınız bir görevdir. Basit görevler, mevcut kodu Eşzamanlılık Çalışma Zamanı'nın zamanlama işlevselliğini kullanacak şekilde uyarladığınızda kullanışlıdır.
Önkoşullar
Bu kılavuza başlamadan önce Görev Zamanlayıcı konusunu okuyun.
Örnek
Aşağıdaki örnekte, iş parçacığı oluşturmak ve yürütmek için Windows API'sinin tipik kullanımı gösterilmektedir. Bu örnek, ayrı bir iş parçacığında öğesini çağırmak MyThreadFunction
için CreateThread işlevini kullanır.
İlk kod
// 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;
}
Bu örnek aşağıdaki çıkışı oluşturur.
Parameters = 50, 100
Aşağıdaki adımlarda aynı görevi gerçekleştirmek için Eşzamanlılık Çalışma Zamanı'nı kullanmak üzere kod örneğinin nasıl uyarlanmış olduğu gösterilmektedir.
Örneği basit bir görev kullanacak şekilde uyarlamak için
- concrt.h üst bilgi dosyası için bir
#include
yönerge ekleyin.
#include <concrt.h>
- Ad alanı için
concurrency
birusing
yönerge ekleyin.
using namespace concurrency;
- bildirimini
MyThreadFunction
çağıran kuralı kullanacak__cdecl
ve döndürecekvoid
şekilde değiştirin.
void __cdecl MyThreadFunction(LPVOID param);
- Yapıyı
MyData
, ana uygulamaya görevin tamamlandığını belirten bir eşzamanlılık::event nesnesi içerecek şekilde değiştirin.
typedef struct MyData {
int val1;
int val2;
event signal;
} MYDATA, *PMYDATA;
- çağrısı
CreateThread
yerine eşzamanlılık::CurrentScheduler::ScheduleTask yöntemini çağırın.
CurrentScheduler::ScheduleTask(MyThreadFunction, pData);
- öğesinin çağrısını
WaitForSingleObject
, görevin tamamlanmasını beklemek için concurrency::event::wait yöntemine yapılan bir çağrıyla değiştirin.
// Wait for the task to finish.
pData->signal.wait();
çağrısı kaldırın
CloseHandle
.tanımının
MyThreadFunction
imzasını 3. adımla eşleşecek şekilde değiştirin.
void __cdecl MyThreadFunction(LPVOID lpParam)
- İşlevin
MyThreadFunction
sonunda concurrency::event::set yöntemini çağırarak ana uygulamaya görevin tamamlandığının sinyalini verin.
pData->signal.set();
- deyimini
return
uygulamasındanMyThreadFunction
kaldırın.
Tamamlanan kod
Aşağıdaki tamamlanmış örnek, işlevi çağırmak MyThreadFunction
için basit bir görev kullanan kodu gösterir.
// 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();
}