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

  纤程(来自百科):

    纤程是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. ssgvip设置

    ssgvip.tpl set service "{vipport}" protocol {xieyi} src-port 0-65535 dst-port {vipport}-{v ...

  2. HIVE- 删除功能

    删除分区: ALTER TABLE table_name DROP PARTITION (partition_name='20220101');

  3. Docker 安装开发运行环境

    Centos7安装docker .参考官方网站 docker官方 1.1 使用以下命令即可 yum install -y yum-utils device-mapper-persistent-data ...

  4. 南大ics-pa/PA1.1过程及感想

    1.1 一.在红白模拟器上运行超级马里奥游戏 1.将游戏rom文件mario.nes移至~/ics2022/fceux-am/nes/rom文件下,并回到~/ics2022/fceux-am下执行ma ...

  5. [2] Bert 论文精读

    BERT是NLP领域让预训练这件事情出圈的工作. 开篇Introduction介绍了两类主流的预训练方法: 1.feature-based,即基于特征的,即我首先通过预训练得到一些比较好的特征,然后将 ...

  6. dcloud打包安卓隐私政策上架问题!

    友情链接: https://ask.dcloud.net.cn/article/36937 两种方式: 方式1. 使用dcloud的方式,在打包文件中配置 隐私json文件,使用dclould封装的隐 ...

  7. elastalert部署和使用

    一.Elastalert简介 Elastalert是Yelp公司基于python开发的ELK日志告警插件,Elastalert通过查询Elasticsearch中的记录与定于的告警规则进行对比,判断是 ...

  8. IaaS--区域和可用区(何恺铎《深入浅出云计算》笔记整理)

    [关键概念] IaaS(Infrastructure as a Service):即"基础设施即服务",一般指云计算所提供的计算.存储.网络等基本底层能力.是基于软件技术对物理硬件 ...

  9. uniapp与原生交互

    1.项目中引入 DSBridge.js 文件 var bridge = { default: this, call: function(b, a, c) { var e = ""; ...

  10. py06

    元祖tuple 与列表类似可以存多个值,但是不同的是元祖本身不能被修改 #一:基本使用:tuple# 1 用途:记录多个值,当多个值没有改的需求,此时用元组更合适 # 2 定义方式:在()内用逗号分隔 ...