一、才用createThread创建多线程,需要先声明一个多线程句柄(全局的)如:hThread:THandle;

二、声明了一个多相处句柄之后,还需要先写一个函数,在创建多线程是用来掉用的函数。

三、使用createThread创建多线程,hThread:=createThread(nil, 0, @MyThreadFun1, nil, CREATE_SUSPENDED, ID);这里线程创建起是挂起状态

createThread方法参数:

function CreateThread(
lpThreadAttributes: Pointer;           {安全设置}
dwStackSize: DWORD;                    {堆栈大小}
  lpStartAddress: TFNThreadStartRoutine; {入口函数}
  lpParameter: Pointer;                  {函数参数}
  dwCreationFlags: DWORD;                {启动选项}
  var lpThreadId: DWORD                  {输出线程 ID }
): THandle; stdcall;                     {返回线程句柄}

四、使用线程时,需要将线程唤醒。不适用是需要将线程挂起。

ResumeThread(hThread);{唤醒线程}

SuspendThread(hThread);{挂起线程}

程序例子:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    tmr1: TTimer;
    edt1: TEdit;
    btn4: TButton;
    btn5: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  hThread: THandle;
  hThread1:THandle;
  num: Integer;
  num1:Integer;
{$R *.dfm}

{线程入口函数}

function MyThreadFun(p: Pointer): Integer; stdcall;
begin
   while True do       {假如线程不挂起,循环一直运行}
   begin
      num:=Random(1000);
   end;
   Result:=0;
end;

function MyThreadFun1(p: Pointer): Integer; stdcall;
begin
   while True do       {假如线程不挂起,循环一直运行}
   begin
      num1:=Random(1000);
   end;
   Result:=0;
end;

{第一个按钮,用于建立和挂起线程,线程挂起相当于是线程暂停}
procedure TForm1.btn1Click(Sender: TObject);
var
  ID:DWORD;
begin
   hThread:=CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
   hThread1:=CreateThread(nil, 0, @MyThreadFun1, nil, CREATE_SUSPENDED, ID);
   btn1.Enabled:=False;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
   ResumeThread(hThread);{唤醒线程}
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
    SuspendThread(hThread);{挂起线程}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    tmr1.Interval:=100;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
    Text := IntToStr(num);
    edt1.Text:=IntToStr(num1);
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
    ResumeThread(hThread1);{唤醒线程2}
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
   SuspendThread(hThread1);{挂起线程2}
end;unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    tmr1: TTimer;
    edt1: TEdit;
    btn4: TButton;
    btn5: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  hThread: THandle;
  hThread1:THandle;
  num: Integer;
  num1:Integer;
{$R *.dfm}

{线程入口函数}

function MyThreadFun(p: Pointer): Integer; stdcall;
begin
   while True do       {假如线程不挂起,循环一直运行}
   begin
      num:=Random(1000);
   end;
   Result:=0;
end;

function MyThreadFun1(p: Pointer): Integer; stdcall;
begin
   while True do       {假如线程不挂起,循环一直运行}
   begin
      num1:=Random(1000);
   end;
   Result:=0;
end;

{第一个按钮,用于建立和挂起线程,线程挂起相当于是线程暂停}
procedure TForm1.btn1Click(Sender: TObject);
var
  ID:DWORD;
begin
   hThread:=CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);
   hThread1:=CreateThread(nil, 0, @MyThreadFun1, nil, CREATE_SUSPENDED, ID);
   btn1.Enabled:=False;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
   ResumeThread(hThread);{唤醒线程}
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
    SuspendThread(hThread);{挂起线程}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    tmr1.Interval:=100;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
    Text := IntToStr(num);
    edt1.Text:=IntToStr(num1);
end;

procedure TForm1.btn4Click(Sender: TObject);
begin
    ResumeThread(hThread1);{唤醒线程2}
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
   SuspendThread(hThread1);{挂起线程2}
end;

delphi多线程例子 采用createThread创建多线程相关推荐

  1. 采用CreateThread()创建多线程程序

    采用CreateThread()创建多线程程序 在window环境下,Win32 提供了一系列的API函数来完成线程的创建.挂起.恢复.终结以及通信等工作: 1.主要的函数列表: 序号 函数名 功能 ...

  2. java学习笔记 多线程(一)创建多线程,线程常用方法

    首先是进程和线程的区别,进程就是像打开csgo.exe就是一个进程,然后打开LOL.exe又是另外一个进程了. 而线程呢,就是在同一进程内部,发生的事情. 那么就开始了解线程! 创建多线程: 线程有三 ...

  3. JavaEE多线程基本概念 及 创建多线程程序的三种方式

    Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...

  4. 创建多线程的几种方法介绍

    目录 线程的概念及单线程多线程区别 创建多线程--继承线程类 创建多线程--实现Runnable接口 创建多线程--匿名类 总结 线程的概念及单线程多线程区别 首先要理解进程(Processor)和线 ...

  5. Delphi多线程详解CreateThread、TThread,以及线程间通过临界区(CriticalSection)实现同步

     在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:ht ...

  6. delphi 讲的比较详细的多线程(推荐)

     在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程. 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考:ht ...

  7. 转:MFC中创建多线程

    MFC中创建多线程 MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员,可 ...

  8. VC多线程编程之线程创建与示例

    一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...

  9. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

最新文章

  1. Delphi使用资源文件全攻略
  2. 【Linux系统编程】IO多路复用之epoll
  3. BW report execution callstack
  4. 揭开.NET 2.0配置之谜(一)
  5. 知道无人驾驶的网络安全有多重要吗?英国政府都决定插手开发了
  6. 服务器如何查看gpu型号,linux 查看服务器gpu
  7. javac命令不好用的解决方法
  8. java 转为Calendar_在Java中将String转换为Calendar对象
  9. win10 redis安装教程
  10. 8.企业安全建设入门(基于开源软件打造企业网络安全) --- 态势感知系统建设
  11. 基于java的教材管理_基于JAVA Web教材管理系统设计与实现.doc
  12. CADD课程学习(4)-- 获取没有晶体结构的蛋白(SWISS-Model)
  13. 方法:如何下载微信文章里的音频?-2022.4.13(已解决)
  14. mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化
  15. 给大龄程序员的4种竞争力策略
  16. [张雨生][张雨生典藏合集22CD][APE/整轨/7.56 GB][旋风/快传]
  17. 卡尔曼滤波数据融合算法
  18. 【数据库】Oracle基础命令
  19. mysql 怎么存经纬度_mysql存储地图经纬度的表怎么设计?
  20. 解决ks8.0抓包问题

热门文章

  1. udec采场开挖教程_基于UDEC的采场矿山压力显现数值模拟研究
  2. android+汽车零部件企业的供应商质量管理体系有待完善,汽车零部件采购质量管理的相关探讨论文...
  3. 深度学习模型实战-深度学习模型在各大公司实际生产环境的应用讲解文章
  4. 【Python】打印输出200以内的所有素数,并输出素数的个数
  5. 外贸常用工具-领英精灵的批量加好友功能详细解析
  6. SQL语句中except是怎样用的?
  7. Angularts将前端数据生成报表
  8. 百度云无法在网页上调用客户端进行下载文件(已安装最新版)
  9. 树莓派系统烧录,连接电脑,电脑远程桌面控制树莓派(树莓派无屏幕,校园网)
  10. [转]局域网共享一键修复 18.5.8 https://zhuanlan.zhihu.com/p/24178142