WinAPI » Procesy i wątki

CreateThread

  • 2010-10-31 18:27
  • 0 komentarzy
  • 598 odsłon
  • Oceń ten tekst jako pierwszy
// C
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
                     SIZE_T dwStackSize,
                     LPTHREAD_START_ROUTINE lpStartAddress,
                     LPVOID lpParameter,
                     DWORD dwCreationFlags,
                     LPDWORD lpThreadId
);

// Delphi
function CreateThread(lpThreadAttributes: PSECURITY_ATTRIBUTES; dwStackSize: DWORD; lpStartAddress: Pointer; lpParameter: Pointer; dwCreationFlags: DWORD; lpThreadId: PDWORD): DWORD;

Funkcja CreateThread tworzy nowy wątek w ramach procesu który wywołał funkcję.


Parametry
lpThreadAttributes
Wskaźnik do struktury SECURITY_ATTRIBUTES określającej czy uchwyt do wątku może być dziedziczony przez proces potomny. Parametr można ustawić na NULL (Delphi: nil), co powoduje utworzenie wątku z typowymi atrybutami bezpieczeństwa.

dwStackSize
Ilość bajtów przenaczonych na stos wątku. System zaokrąglą tą liczbę do najbliższej wielkości strony pamięci. Jeśli parametrem jest zero, system przydzieli wartość domyślną, czyli 1 MB.

lpStartAddress
Wskaźnik do funkcji wątku.

lpParameter
Wskaźnik do zmiennej która zostanie przekazana funkcji wątku. Może wskazywać na konkretną wartość, lub być wskaźnikiem do struktury danych.

dwCreationFlags
Flagi kontrolujące tworzenie wątku.
Możliwe wartości:
0 - wątek zostanie uruchomiony natychmiast
CREATE_SUSPENDED - wątek zostanie stworzony i natycnmiast zawieszony
STACK_SIZE_PARAM_IS_A_RESERVATION -

W systemach Windows 2000/NT i Windows Me/98/95 flaga STACK_SIZE_PARAM_IS_A_RESERVATION nie jest obsługiwana.

lpThreadId
Wskaźnik do zmiennej przechowującej identyfikator wątku. Jeśli wartość wynosi NULL (nil), identyfikator nie jest zwracany.

W systemach Windows Me/98/95 ten parametr nie może być równy NULL.


Zwracana wartość
Jeśli funkcja się powiedzie, zwracana wartość jest uchwytem do nowego wątku.
Jeśli funkcja się nie powiedzie, zwraca wartość NULL (0). Dodatkowe informacje o błędzie można pobrać za pomocą funkcji GetLastError.


Uwagi
Tworzenie wątku powiedzie się nawet jeśli adress funkcji wątkowej będzie niepoprawny. W takiej sytuacji wątek wywoła wyjątek i zakończy swoje działanie i procesu.

Windows Me/98/95: Funkcja CreateThread zakończy się powodzeniem tylko jeśli zostanie wywołana z 32 bitowej aplikacji.
32 bitowa biblioteka DLL nie może stworzyć wątku, jeśli sama została wywołana przez 16 bitowy program.


Ilość wątków jaką może stworzyć proces jest ograniczona przez ilość dostępnej pamięci wirtualnej. Standardowo każdy wątek ma stos wielkości 1 MB. Można więc stworzyć do 2028 wątków. Zmniejszając wielkość stosu każdego wątku, można ich stworzyć dużo więcej.

Aby stworzyć wątek który pracuje w przestrzeni adresowej innego procesu użyj funkcji CreateRemoteThread.

Szkielet funkcji wątkowej:
DWORD WINAPI Thread(PVOID pVoid)
{
 // kod
}

//Delphi
function ThreadProc(pVoid: Pointer): DWORD; stdcall;



Zobacz też

Artykuł  został umieszczony na liście Zalążków artykułów. Jeżeli możesz rozbuduj go!