首先咱們來看看纖程的定義算法
纖程(來自百科):ide
纖程是Windows爲了將Unix服務程序更好的移植到Windows上而建立的,函數
function CreateFiber(dwStackSize: DWORD; lpStartAddress: TFNFiberStartRoutine; lpParameter: Pointer): Pointer;spa
分配纖程對象,爲其分配一個堆棧,並設置執行函數。若是函數成功,則返回值是纖程的地址。若是函數失敗,則返回值爲nil。線程
當你使用CreateFiber(Ex)函數建立一個纖程以後,該纖程不會執行,由於系統不會自動調度它。你必須調用函數SwitchToFiber來告訴系統你想要哪一個纖程執行。指針
dwStackSize:堆棧的初始大小,以字節爲單位。 若是此參數爲零,則新纖程使用可執行文件的默認堆棧大小。code
lpStartAddress:指向由纖程執行的應用程序定義函數的指針(纖程要執行的功能函數)。 在另外一纖程使用此地址調用SwitchToFiber功能以前,不會開始執行新建立的纖程。對象
lpParameter:傳遞給纖程的變量的指針。 纖程可使用GetFiberData宏檢索此數據。blog
該函數並不能直接運行纖程指定的函數,須要經過 函數 ConvertThreadToFiber 將當前的線程轉化爲纖程纔可以使用。資源
function ConvertThreadToFiber(lpParameter: Pointer): DWORD;
將當前線程轉換爲纖程。 在調度其餘纖程以前,必須將線程轉換爲纖程。
若是函數成功,則返回值是纖程的地址。若是函數失敗,則返回值爲nil。
lpParameter:傳遞給纖程的變量的指針。 纖程可使用GetFiberData宏檢索此數據。
只有纖程才能執行其餘纖程。 若是線程須要執行纖程,則必須調用ConvertThreadToFiber或ConvertThreadToFiberEx來建立一個區域來保存纖程狀態信息。 線程如今是當前的纖程。 該纖程的狀態信息包括lpParameter指定的纖程數據。
BOOL WINAPI ConvertFiberToThread(void);
該函數釋放ConvertThreadToFiber函數分配的資源。 調用此函數後,您沒法從線程調用任何纖程功能。
要編譯使用此功能的應用程序,須要Windows Vista 或者 Windows XP;(--------除此以外的系統不能用了 :( ------------ )
不過我試過貌似能夠手動加載這個函數,經過LoadLibrary。
先看個例子:
咱們先建立個線程對象,而後在線程中建立纖程,在將線程轉爲纖程
線程代碼:
unit ThrdFiber; interface uses Classes,Windows,SysUtils,Dialogs; type TFiber = class(TThread) private { Private declarations } protected procedure Execute; override; public constructor Create(Suspended:Boolean); end; implementation uses Main; { TFiber } var hwnd:Pointer; x:Integer; hThread:Cardinal; procedure SetText(P:Pointer);stdcall; var i:Integer; begin for i := PInteger(P)^ downto 1 do begin MainFrm.Caption:=IntToStr(i); end; SwitchToFiber(Pointer(hThread)); //這裏切換回1,而後後面釋放 2 end; constructor TFiber.Create(Suspended: Boolean); begin inherited; FreeOnTerminate:=True; end; procedure TFiber.Execute; begin x:=5000; hThread:=ConvertThreadToFiber(nil); // 纖程 1 hwnd:=CreateFiber(0,@SetText,PInteger(@x)); // 纖程 2 SwitchToFiber(hwnd); //1 切換 2,那麼2的釋放就得切換回1來釋放,若是沒有切換回1,則下面的語句不會執行 // ShowMessage('沒有執行...'); DeleteFiber(hwnd); //後面還可使用ConvertFiberToThread來結束當前的線程 end; end.
暫時只瞭解這麼多....