Delphi另一个多线程函数:BeginThread
━━━━━━━━━━━━━━━━━━━━━━━━━━

Delphi也提供了一个相同功能的类似函数:
function BeginThread(
    SecurityAttributes: Pointer; 
    StackSize: LongWord; 
    ThreadFunc: TThreadFunc; 
    Parameter: Pointer; 
    CreationFlags: LongWord; 
    var ThreadId: LongWord
): Integer;
━━━━━━━━━━━━━━━━━━━━━━━━━━
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
这里就用到了前面说到的Delphi RTL函数BeginThread,它有很多参数,关键的是第三、四两个参数。
第三个参数就是前面说到的线程函数,即在线程中执行的代码部分。
第四个参数则是传递给线程函数的参数,在这里就是创建的线程对象(即Self)。
第五个是用于设置线程在创建后即挂起,不立即执行(启动线程的工作是在AfterConstruction中根据CreateSuspended标志来决定的),
第六个是返回线程ID。

━━━━━━━━━━━━━━━━━━━━━━━━━━
定义被BeginThread调用的函数
━━━━━━━━━━━━━━━━━━━━━━━━━━

声明:type TThreadFunc : Function(Parameter : Pointer) : Integer;

描述:TThreadFunc定义了一个函数而不是数据。这个函数通常作为BeginThread函数的一个参数,BeginThread是一个单独的线程运行时开始的。这个定义的TThreadFunc函数实现了线程的行为。

函数的返回代码是线程的退出代码。

uses
Forms, Dialogs, Windows, SysUtils;

type
TMsgRecord = record
    thread : Integer;
    msg    : string[30];
end;
TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
end;

var
Form1: TForm1;

Implementation
{$R *.dfm}        // 包含窗体定义

ThreadVar         // 必须允许每个线程有被传递增的记录变量的实例

msgPtr : ^TMsgRecord;

// 私有的线程过程,用于显示字符串
function ShowMsg(Parameter : Pointer) : Integer;
begin
// 设返回值为0
Result := 0;

// 映射指针到被传递进来的参数
// 每个线程有一份独立的msgPtr副本
msgPtr := Parameter;

// 在指定坐标显示对话框
ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,
                 200*msgPtr.thread, 100);

// 结束线程
EndThread(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
id1, id2 : LongWord;
thread1, thread2 : Integer;
msg1, msg2 : TMsgRecord;
showMsgFunc : TThreadFunc;

begin
// 指定线程函数地址
showMsgFunc := Addr(ShowMsg);

//初始化要显示的
msg1.thread := 1;
msg1.msg    := 'Hello World';
msg2.thread := 2;
msg2.msg    := 'Goodbye World';

// 开始第一个线程
thread1 := BeginThread(nil,
                         0,
                         showMsgFunc,
                         Addr(msg1),
                         0,
                         id1);

// 开始第二个线程
thread2 := BeginThread(nil,
                         0,
                         showMsgFunc,
                         Addr(msg2),
                         0,
                         id2);

// 确保线程关闭前,线程应执行完成
ShowMessagePos('Press this when other dialogs finished.', 200, 300);

// 最后关闭线程
CloseHandle(thread1);
CloseHandle(thread2);
end;
end.

程序运行结果,显示3个对话框:
Thread 1 Hello World
Thread 2 Goodbye World
Press this when other dialogs finished.

转自https://www.xuebuyuan.com/467050.html

转载于:https://www.cnblogs.com/zyb2016/p/11151918.html

Delphi另一个多线程函数:BeginThread用法相关推荐

  1. 在Delphi中可用FormatDateTime函数的用法

    function FormatDateTime(const Format: string; DateTime: TDateTime): string; Format参数是一个格式化字符串.DateTi ...

  2. delphi中move函数的用法

    delphi中move函数的用法 -------------------------------------------------------------------------------- 20 ...

  3. Delphi中 StrToIntDef函数的用法

    Delphi中 StrToIntDef函数的用法: 比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strto ...

  4. 在Delphi中FormatDateTime函数的用法

    在Delphi中FormatDateTime函数的用法  function FormatDateTime(const Format: string; DateTime: TDateTime): str ...

  5. delphi中move函数的用法 转

    我们能看到以下代码 var pSource,pDest:PChar;      len: integer; .......................//一些代码 Move(pSource,pDe ...

  6. python中如何查一个函数的用法_Python常见内置函数用法(三)

    本文作者:孙雪丽 文字编辑:周聪聪 技术总编:张学人重大通知!!!2019年6月22日至24日在河南郑州举行Stata编程技术特别训练营,招生工作已经圆满结束.另外爬虫俱乐部将于2019年7月5日至7 ...

  7. c语言createthread函数用法,C++多线程函数CreateThread如何使用?

    C++ CreateThread函数如何传递this指针作为参数 C++多线程函数CreateThread如何使用? #include #include using namespace std; /* ...

  8. Python编程语言学习:python语言中快速查询python自带模块函数的用法及其属性方法、如何查询某个函数关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略

    Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法.如何查询某个函数&关键词的用法.输出一个类或者实例化对象的所有属性和方法名之详细攻略 ...

  9. __init__在python中的用法知乎_python中对_init_的理解及实例解析 python为什么要有一个init函数 知乎...

    Python中"__init__"的意义是什么? Python中__init__的意义依偎着你心跳声如此频繁,就算世界末日小编也会嚣张的笑. 测试人员学python时,应该如何理解 ...

  10. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

最新文章

  1. cuDNN 功能模块解析
  2. 比特币现金压力测试超越了24小时创造新纪录
  3. Log4J配置 category, appender,layout
  4. BookSmart Self Publishing
  5. 使用PHREAK算法实现Drools 6性能
  6. 让Sql Server也能出现如VS一样的智能提示工具--资源更新
  7. leetcode 1584. 连接所有点的最小费用(并查集)
  8. 论文解读丨空洞卷积框架搜索
  9. 神经网络 误差下降 准确率不上升_Go进程的HeapReleased上升,但是RSS不下降造成内存泄漏?...
  10. linux getline函数用法,Linux文本处理三剑客之awk学习笔记05:getline用法详解
  11. php上传文件 报的错误 $_FILES[‘file’]['error']
  12. Entity Framework使用心得
  13. Spring Boot Swagger3启动出现警告Unable to interpret the implicit parameter configuration with dataType
  14. 程序员不做独行侠——沟通的核心是感受
  15. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序
  16. 如何剪切视频,只截取视频中间的一部分
  17. 美国软件开发实习生月薪排行榜
  18. 创造与魔法服务器在哪里显示,创造与魔法监狱在哪里 创造与魔法监狱坐标
  19. 三十、Fluent两种蒸发-冷凝模型理论及设置
  20. linux 中的指令

热门文章

  1. 互联网产品经理好书推荐
  2. 算法分析与设计 八大排序算法
  3. 诺基亚n1平板电脑刷机教程_Z Launcher详细使用教程_诺基亚 N1_平板电脑新闻-中关村在线...
  4. Visual Studio中绘制UML用例图
  5. linux统计某种文件大小命令,linux下对符合条件的文件大小做汇总统计的简单命令...
  6. 多应用集中落地,四川区块链产业爆发增长
  7. php laravel手册,laravel5.6手册下载|Laravel5.6中文手册pdf最新版下载(附使用方法)_星星软件园...
  8. 电信中兴B860AV2.1-T_线刷固件包
  9. 计算机辅助设计rhino试题,计算机辅助设计基础期末复习试题(完整版).doc
  10. 【OVRP问题】基于鲸鱼优化算法求解开放式车辆路径问题附matlab代码