Aracılığıyla paylaş


İ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.

Ön koş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

  1. concrt.h üst bilgi dosyası için bir #include yönerge ekleyin.
#include <concrt.h>
  1. Ad alanı için concurrency bir using yönerge ekleyin.
using namespace concurrency;
  1. bildirimini MyThreadFunction çağıran kuralı kullanacak __cdecl ve döndürecek voidşekilde değiştirin.
void __cdecl MyThreadFunction(LPVOID param);
  1. 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;
  1. çağrısı CreateThread yerine eşzamanlılık::CurrentScheduler::ScheduleTask yöntemini çağırın.
CurrentScheduler::ScheduleTask(MyThreadFunction, pData);
  1. öğ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();
  1. çağrısı kaldırın CloseHandle.

  2. tanımının MyThreadFunction imzasını 3. adımla eşleşecek şekilde değiştirin.

void __cdecl MyThreadFunction(LPVOID lpParam)
  1. İşlevin MyThreadFunction sonunda concurrency::event::set yöntemini çağırarak ana uygulamaya görevin tamamlandığının sinyalini verin.
pData->signal.set();
  1. deyimini return uygulamasından MyThreadFunctionkaldı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();
}

Ayrıca bkz.

Görev Zamanlayıcı
Zamanlayıcı Sınıfı