首先咱们来看看纤程的定义算法
纤程(来自百科):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.
暂时只了解这么多....