Delphi中纖程的使用

首先咱們來看看纖程的定義算法

  纖程(來自百科):ide

    纖程是Windows爲了將Unix服務程序更好的移植到Windows上而建立的,函數

    線程是在Windows內核中實現的,纖程是在用戶模式下實現的,內核對纖程一無所知,內核會根據咱們定義的算法來對纖程進行調度。
    一個線程能夠包含一個或多個纖程。多個纖程可使用單個線程來運行。單個纖程也能夠被多個線程運行,但每次只能有一個線程運行它。
    纖程必定要經過線程來關聯它。
    
 
Delphi中關於纖程的函數或者WindowsAPI有:            

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.

暫時只瞭解這麼多....

相關文章
相關標籤/搜索