首先我们来看看纤程的定义

  纤程(来自百科):

    纤程是Windows为了将Unix服务程序更好的移植到Windows上而创建的,

    线程是在Windows内核中实现的,纤程是在用户模式下实现的,内核对纤程一无所知,内核会根据我们定义的算法来对纤程进行调度。
    一个线程可以包含一个或多个纤程。多个纤程可以使用单个线程来运行。单个纤程也可以被多个线程运行,但每次只能有一个线程运行它。
    纤程一定要通过线程来关联它。
    
 
Delphi中关于纤程的函数或者WindowsAPI有:            

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

分配纤程对象,为其分配一个堆栈,并设置执行函数。如果函数成功,则返回值是纤程的地址。如果函数失败,则返回值为nil。

当你使用CreateFiber(Ex)函数创建一个纤程之后,该纤程不会执行,因为系统不会自动调度它。你必须调用函数SwitchToFiber来告诉系统你想要哪个纤程执行。

dwStackSize:堆栈的初始大小,以字节为单位。 如果此参数为零,则新纤程使用可执行文件的默认堆栈大小。

lpStartAddress:指向由纤程执行的应用程序定义函数的指针(纤程要执行的功能函数)。 在另一纤程使用此地址调用SwitchToFiber功能之前,不会开始执行新创建的纤程。

lpParameter:传递给纤程的变量的指针。 纤程可以使用GetFiberData宏检索此数据。

该函数并不能直接运行纤程指定的函数,需要通过 函数 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.

暂时只了解这么多....

Delphi中纤程的使用的更多相关文章

  1. DELPHI纤程的演示

    DELPHI纤程的演示 DELPHI7编译运行通过. 纤程实现单元: unit FiberFun; //Fiber(纤程测试Demo)//2018/04/11//QQ: 287413288 //参考 ...

  2. Delphi主线程重入而导致程序卡死的解决方案

    Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调 ...

  3. delphi 主线程向子线程发送消息

    while True do begin if not PeekMessage(msg,0,0,0,PM_REMOVE) then begin case MsgWaitForMultipleObject ...

  4. delphi 利用 InterlockedCompareExchange 实现主线程维一锁等待

    在进行资源锁定时,一般是线程之间进行交互,很少需要在主线程也对资源进行锁定. 不过在一些复杂的业务中,存在子线程与主线程的交互,且一些资源也同步在主线程中使用时,主线程资源锁,就有存在的必要. 假定有 ...

  5. delphi 程 序从exe运行改成dll库

    第一种方法: 具体步骤: 1.生成新的或着打开已经存在的工程文件(DPR)(Project1.dpr). 2.选择[View]—>[Project Manager],选中[ProjectGrou ...

  6. Delphi Firemonkey在主线程 异步调用函数(延迟调用)

    先看下面的FMX.Layouts.pas中一段代码 procedure TCustomScrollBox.MouseDown(Button: TMouseButton; Shift: TShiftSt ...

  7. delphi tidhttp 超时设置无效的解决方法

    现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...

  8. Delphi:与VCL同步(Synchronize()、用消息来同步)

    看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...

  9. 关于Delphi中多线程传递参数的简单问题

    http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) ...

  10. Delphi管理多线程之线程局部存储:threadvar

    尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题.其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一个线程中的某些事件要在另一个线程中的其他时间之前(或之后) ...

随机推荐

  1. Eureka服务剔除下线

    1.参考文档: https://www.centoscn.vip/4317.html 2.剔除服务 格式: curl -X PUT "http://ip:port/eureka/apps/{ ...

  2. 成都信息工程大学第八届校赛 H J 题解

    H. Bang Bang Keli Ba 题目大意 给定数组 \(a\) ,构造递增序列 \(b\) 和递减序列 \(c\) 且 \(a_i=b_i+c_i\) . 题解 下面证明解的存在性,存在性证 ...

  3. 20203412马畅若 实验三 《Python程序设计》Socket编程技术实验报告

    实验三 Socket编程技术 课程:<Python程序设计>班级: 2034姓名: 马畅若学号:20203412实验教师:王志强实验日期:2020年5月30日必修/选修: 公选课 ##1. ...

  4. CCF-CSP准备

    dfs序,unique vector sort(que+1,que+1+cnt); len = unique(que+1,que+cnt+1)-que-1; for(int i = 1;i <= ...

  5. (0501) perl-正则表达式-匹配关键字task【知乎】

    (1)

  6. 51电子-STC89C51开发板:开发包

    全部内容,请点击: 51电子-STC89C51开发板:<目录> ---------------------------  正文开始  --------------------------- ...

  7. Javascript格式化数字字符串,如手机号,银行卡号的格式化

    手机号13312341234转化成133 1234 1234 //方式一 function format_tel(tel){ tel = String(tel); return tel.replace ...

  8. top usage

    https://www.cnblogs.com/dragonsuc/p/5512797.html

  9. jabc连接数据库

    Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JD ...

  10. 04jsp(1)

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...