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

  纤程(来自百科):

    纤程是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. 课程表及事件提醒app-界面原型设计

    前端设计: 暂定为8个主要界面:程序初始界面.主界面(首页).课表界面."我的"界面.登录界面.注册界面.创建事件界面.新建课表界面 设计思路: 项目结构 三个主要界面 首页: 课 ...

  2. python 小顶堆

    from heapq import *heap=[]for i in range(10,1,-1): heappush(heap,i)print(heap)print(heappop(heap))pr ...

  3. JAVA笔记_方法递归调用

    方法递归调用   简单地说递归调用就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题,同时可以让代码变得更加简洁. 递归调用执行机制案例1: /** * @ClassName ...

  4. 和为K的子数组

    给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 . /** * @param {number[]} nums * @param {number} k ...

  5. (0514)芯王国-志锐-Sd卡高速控制-AXI验证

    (1)commit (2)core  (3)generate (4)struct  结构体 (5)

  6. 3、app自动化:使用appium定位元素的方式及元素的常用操作

    前提: 没有的包,要先进行对应包的安装 如:pip install Appium-Python-Client 一.定位元素,包括属性定位和xpath定位方式 a\属性定位 属性 定位方式     示例 ...

  7. 把pyecharts动图导入到PPT中

    如何把echarts 动图导入PPT 置顶 且听风来 2019-05-22 14:54:17 3347 收藏 6展开 首先看PPT是否开启插件,开启后 此处就有标志,然后就在你想插入的幻灯片处插入两个 ...

  8. python39

    Python pass 是空语句,是为了保持程序结构的完整性. pass 不做任何事情,一般用做占位语句. Python 语言 pass 语句语法格式如下: pass 测试实例: 实例 #!/usr/ ...

  9. Keil51单片机数码管鬼影显示问题

    Keil51单片机数码管鬼影显示问题 所为的鬼影就是程序逻辑正确,但电路逻辑有问题.就是按程序逻辑,前一个数字显示后,直接显示下一组数字,因为没清干净,导致瞬间残留: 处理的办法,就是有就显示,没有就 ...

  10. python基础 补漏

    输出 -----------定义变量类型 类型 集合 mongodb的用法和redis差不多一样的 NoSQL 数据库之一 https://www.runoob.com/python3/python- ...