Delphi另一个多线程函数:BeginThread用法 - zyb2016

zyb2016 2021-08-13 原文


Delphi另一个多线程函数:BeginThread用法

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

发表于
2019-07-08 16:16 
zyb2016 
阅读(1252
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zyb2016原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zyb2016/p/11151918.html

Delphi另一个多线程函数:BeginThread用法 - zyb2016的更多相关文章

  1. 银行核心项目之测试阶段 – zouhui

    银行核心项目之测试阶段 2019-05-15 20:34  zouhui  阅读(8412)  评论(0)  […]...

  2. 团队-象棋游戏-需求分析 – 棠梨煎雪又落雨

    团队-象棋游戏-需求分析 象棋游戏-需求分析 1.象棋是一款益智类游戏,但是因为人机交互设计比较困难,所以本小 […]...

  3. 进制的概述 – LoaderMan

    进制的概述 正数的原码,反码 ,补码都是相同的, 负数的反码是在原码的基础上, 符号位不变, 数值位取反 ; […]...

  4. Linux & Windows 查看 ip 地址

    Windows 查看本机 IP 打开 cmd,输入 ipconfig,回车,找到IPv4地址   或者通过以下 […]...

  5. C# Xml Linq XDocument 基本操作 — 重新学习

    person.xml <?xml version="1.0" encoding="utf-8"?> […]...

  6. 推荐工具—云U盘、文本剪切板 – zsxucg

    无限速的愤懑无中毒的担忧 云U盘https://app.tmp.link/https://cp.anyknew […]...

  7. 专业团队 —— 项目介绍

    博客班级 班级 团队名称 专业团队 这个作业的目标 对选题进行描述,包括选题背景,选题意义,竞品分析等 作业正 […]...

  8. SURF算法学习心得 – 王大王

    SURF算法学习心得 本文主要内容来自下面两篇博客: http://www.yongblog.com/arch […]...

随机推荐

  1. [绝对干货] 入门区块链技术看这里就够了

    区块链技术干货集合 A collection of awesome blockchain articles. […]...

  2. 闲置计算机 挖矿

    最近了解了一个挖矿平台,这个其实就是利用你的电脑挖虚拟货币,一路赚钱总的来说优势在于支持的平台多(支持wind […]...

  3. Java图形界面学习———简易登录界面

    /** * @author Administrator * Java图形界面学习---------简易登录界面 […]...

  4. 7-JavaScript 语法

    7-JavaScript 语法body { margin: 0 }#content-info { width: auto; margin: 0 auto; text-align: center }#author-info { white...

  5. Oracle GoldenGate 19.1新特性

    1.GoldenGate 19.1 新特性概览a.支持Oracle数据库19.1 长期支持发布版本。集成Ora […]...

  6. ThreadLocal 遇上线程池的问题及解决办法

          ThreadLocal 称为线程本地存储,它为每一个使用它的线程提供一个其值(value)的副本。 […]...

  7. 串行通信

    一.串行通信的基本方式 异步通信 以字符为传送单位,用起始位和停止位标识每个字符的开始和结束字符间隔不固定,只 […]...

  8. keepalived+双主架构部署

    在高可用集群环境中,keepalived使用的是VIP,利用keepalived自带的服务监控功能和自定义脚本 […]...

展开目录

目录导航