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

  纤程(来自百科):

    纤程是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. centos6.5最小安装不能联网

    因为个人需要,在一台笔记本安装centos6.5最小安装时遇到了无法有线联网,后面经过了几个小时的处理 总算理清楚并解决了这个问题.亲测有效而不是转载! 如上图所示 处理这个问题颇有感受,在网上找了很 ...

  2. C++ Gui Qt4 第二章

    这一章需要使用在控制台使用qmake 使用qmake的时候要先配置qmake的环境变量 找到qmake所在的目录,添加环境变量即可 在使用的时候要先跳转到源文件所在的目录 课本中说qmake可以自动检 ...

  3. CSP202104-4 校门外的树

    设状态时,首先从简单状态设起: 一维不行再试二维.简单状态应付不了再设复杂的(因为某些状态可以体现在状态转移的过程中,或者说状态转移方程中,不一定体现在原式中) E.g. 计算机软件能力认证考试系统- ...

  4. AndroidQ 打通应用层到HAL层(转)

    1. 参考https://blog.csdn.net/qq_34211365/category_9903135.html 直通式,绑定式,从应用端调到hal接口,亲自实现能够更加理解

  5. android系统源码编译报错问题分析处理--持续更新

    一.build/make/core/base_rules.mk:232: error: packages/services/Car/service: LOCAL_BUILT_MODULE and LO ...

  6. yolov5查看训练日志图片和直方图(包括稀疏训练bn直方图)

    0.D:\code\codePy\yolov5-6.1\runs\train\exp25文件夹下有 events.out.tfevents.1675823043.DESKTOP-ACC9FL4.521 ...

  7. 微信小程序顶部透明

    { "pages": [ "pages/index/index" ], "window": { "backgroundTextSt ...

  8. linux check folder files how many files

    https://linuxhandbook.com/count-number-files/ tree -a

  9. ES得分

    一.概念 1.ES主要用于搜索 2.搜索要把更有相关性的结果展示出来 3.对一个文档评分,相关性越大,评分越高 4.打分的本质是排序 二.评分规则 1.ES5之前,默认评分规则是TF-IDF,这是信息 ...

  10. windows11上面打开HEIC文件的有效方法

    今天在传资料的时候,用手机拍了一张照片传到window11,打开时竟然无法打开,顿时有点诧异,仔细看了文件类型(HEIC),可能软件不识别,怎么解决呢? 经过搜索整理尝试了许多方法,没找到一个合适的. ...