Wątek->włókno

0

jak można z poziomu Delphi kontrolować włókna w wątku ??

0

Delphi 6. Vademecum profesjonalisty :) . A oto skrót:

function ConvertThreadTiFiber(lpParameter: Pointer): BOOL; stdcall;

Funkcja ConvertThreadToFiber() tworzy włókno równoważne wątkowi, w którym wywołano tą funkcję. Jako parametr przekazujemy wskaźnik do danych specyficznych dla włókna (parametr bez znaczenia dla Win32). Wynikiem jest wskaźnik do włókna jako obiektu Win32 (a nie wartość boolowska, w module Windows.pas był błąd).

function CreateFiber(dwStackSize: DWORD; lpStartAddress: TFNFiberStartRoutine; lpParameter: Pointer): BOOL; stdcall;

Funkcja CreateFiber() tworzy nowe włókno. 1. parametr oznacza początkowy rozmiar stosu przydzielonego dla włókna (jeśli 0, to powoduje to przyjęcie wartości domyślnej - stos o rozmiarze równym stosowi wątku nadrzędnego). Parametr lpStartAddress jest wskaźnikiem do bezparametrowej procedury realizującej treść włókna. Parametr lpParameter umożliwia przekazanie dodatkowych danych. Ta deklaracja też jest, niepoprawna, wynikiem jest znowu wskaźnik do obiektu Win32.

function SwitchToFiber(lpFiber: Pointer): BOOL; stdcall;

W rzeczywistości jest to procedura (kolejna błędna deklaracja). Jedyny parametr to wskaźnik do obiektu włókna. Wywołanie tej procedury powoduje automatycznie przełączenie kontekstu wykonawczego (stosu i rejestrów procesora).

function DeleteFiber(lpFiber: Pointer): BOOL; stdcall;

Następna błędna deklaracja, w rzeczywistości jest to procedura. Usuwa ona włókno, a jej jedynym parametrem jest wskaźnik do obiektu włókna. Wywołanie DeleteFiber() ze wskaźnikiem włókna wywołującego (ale zamieszałem :) )powoduje automatyczne wywołanie funkcji ExitThread() kończącej wykonywanie całego wątku. W Delphi 6. Vademecum profesjonalisty podane były ponadto źródła 2 funkcji przełożonych z pliku winnt.h:

uses Windows;

function GetCurrentFiber: Pointer;
asm
  mov eax, fs:[$10]
end;

function GetFiberData: Pointer;
asm
  mov eax, fs:[$10]
  mov eax, [eax]
end;

Pierwsza funkcja zwraca wskaźnik do aktualnego włókna, a druga (chyba :) ) do danych włókna. Jeszcze raz zaznaczam, że wszystko, co napisałem wyżej pochodzi z książki Delphi 6. Vademecum profesjonalisty (na marginesie można dodać, że ciekawa lektura :] ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1