Delphi中纤程的使用
首先我们来看看纤程的定义
纤程(来自百科):
纤程是Windows为了将Unix服务程序更好的移植到Windows上而创建的,
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中纤程的使用的更多相关文章
- DELPHI纤程的演示
DELPHI纤程的演示 DELPHI7编译运行通过. 纤程实现单元: unit FiberFun; //Fiber(纤程测试Demo)//2018/04/11//QQ: 287413288 //参考 ...
- Delphi主线程重入而导致程序卡死的解决方案
Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调 ...
- delphi 主线程向子线程发送消息
while True do begin if not PeekMessage(msg,0,0,0,PM_REMOVE) then begin case MsgWaitForMultipleObject ...
- delphi 利用 InterlockedCompareExchange 实现主线程维一锁等待
在进行资源锁定时,一般是线程之间进行交互,很少需要在主线程也对资源进行锁定. 不过在一些复杂的业务中,存在子线程与主线程的交互,且一些资源也同步在主线程中使用时,主线程资源锁,就有存在的必要. 假定有 ...
- delphi 程 序从exe运行改成dll库
第一种方法: 具体步骤: 1.生成新的或着打开已经存在的工程文件(DPR)(Project1.dpr). 2.选择[View]—>[Project Manager],选中[ProjectGrou ...
- Delphi Firemonkey在主线程 异步调用函数(延迟调用)
先看下面的FMX.Layouts.pas中一段代码 procedure TCustomScrollBox.MouseDown(Button: TMouseButton; Shift: TShiftSt ...
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- Delphi:与VCL同步(Synchronize()、用消息来同步)
看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...
- 关于Delphi中多线程传递参数的简单问题
http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) ...
- Delphi管理多线程之线程局部存储:threadvar
尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题.其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一个线程中的某些事件要在另一个线程中的其他时间之前(或之后) ...
随机推荐
- PHP_工厂模式
实例化类,先需要引入类文件,但是有时候我们并不知道可能要用到那些类,如果将所有类文件全部引入,会造成资源浪费,这时候可以采用工厂模式,专门用于 自动加载.实例化 类. 实例代码: 注:案例中假设有一个 ...
- U盘插上电脑上后自动备份文件
缘由 一直有个不好的习惯,将所有文件都存在个人U盘,下班直接拔了就回家. 前久把U盘插入MacBook后,U盘就无法读数据了,搞了很久也没搞定. 当然了,里面的数据也无法使用了. 所以,现在的想法: ...
- mysql5.7 不兼容问题
通过navicat工具导入psc数据库备份文件,报错如下,mysql版本5.7 执行如下语句不通过 DROP TABLE IF EXISTS `guard_user`; CREATE TABLE `g ...
- kali对安卓的渗透(内网穿透)
前言:随着移动端的增加,安卓占比巨大,人们对手机的安全防范意识薄弱,手机为了人们更加的方便,缺乏防护软件,甚至好多木马不需要做免杀. 现在我来做安卓的渗透,不需要在内网也能进行,实现了内网穿透.(有公 ...
- Go组件库总结之无等待锁
本篇文章我们用Go封装一个无等待锁库.文章参考自:https://github.com/brewlin/net-protocol 1.锁的封装 type Mutex struct { v int32 ...
- Go--解析yaml文件
yaml 文件是目前最常用的配置文件,使用go语言编写代码和工具时,也会用到yaml文件,将服务配置及中间件等信息定义到yaml文件中,后续可根据实际场景来选用. //先下载外部包 go get -u ...
- mybatis-plus 使用 sql 分页
#分页工具类 /** * 分页参数处理 */public class PageUtil { /** * 分页返回数据封装 * * @param page * @return Map<String ...
- DP7361 是一款立体声六通道线性输出的数模转换器-兼容CS4361
DP7361 是一款立体声六通道线性输出的数模转换器,内含插值滤波器.Multi-Bit 数模转换器.模拟输出滤波器,支持主流的音频数据格式. DP7361 片上集成线性低通模拟滤波器和四阶Multi ...
- zk-复制安装
Zookeeper系列一:Zookeeper介绍.Zookeeper安装配置.ZK Shell的使用 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分 ...
- DELL服务器升级BIOS,做RAID磁盘阵列
dell服务器BIOS升级.LSI集成整列卡驱动安装 1.下载启动盘rufus,安装linux系统到U盘 1.准备两个U盘,插入启动U盘进入系统,进入centos7选择页面,插入另一个U盘用于安装li ...