跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
      • TThread
        • 线程类
        • 界面类
      • API
    • 线程同步
  • 网络编程

    • 网络编程基础
    • Delphi网络编程
    • select
    • WSAAsyncSelect
    • WSAEventSelect
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
    • 中介者模式
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 基础语法
舞动的代码
2022-05-05
目录

线程控制

这个好像并没有什么需要特别说明的东西,所谓的控制包括但不限于启动、暂停、停止和通讯。通讯问题放在后面讲解线程同步时处理

Delphi对于多线程的控制同样提供了两套不同的处理方式

# TThread

# 线程类

unit UnitThread;

interface

uses
  Vcl.Forms, Vcl.Dialogs, System.SysUtils, System.Classes;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

implementation

uses
  UnitMain;

{ TMyThread }

procedure TMyThread.Execute;
var
  I: Integer;
begin
  FreeOnTerminate := False;
  I := 1;
  while True do begin
    if FreeOnTerminate then
      Exit;

    Synchronize(
      procedure
      begin
        form1.lbl1.Caption := '线程ID:' + Self.ThreadID.ToString + ':' + I.ToString;
      end);
    TThread.Sleep(300);
    I := I + 1;
  end;

end;

end.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 界面类

unit UnitMain;

interface

uses
  System.Generics.Collections, UnitThread, Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls,
  Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    lbl1: TLabel;
    btn4: TButton;
    btn5: TButton;
    btn6: TButton;
    lbl2: TLabel;
    btn7: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Thread: TMyThread;
  ThreadList: TList<TMyThread>;

implementation

{$R *.dfm}
{启动线程}
procedure TForm1.btn1Click(Sender: TObject);
begin
  Thread := TMyThread.Create(True);
  Thread.Start;
end;

{暂停线程}
procedure TForm1.btn2Click(Sender: TObject);
begin
  Thread.Suspended := True;
end;

{继续线程}
procedure TForm1.btn3Click(Sender: TObject);
begin
  Thread.Resume;
end;


{批量启动多个线程}
procedure TForm1.btn4Click(Sender: TObject);
begin
  ThreadList := TList<TMyThread>.Create;

  TThread.CreateAnonymousThread(
    procedure
    var
      I: Integer;
      Mthread: TMyThread;
    begin
      for I := 0 to 10 do begin
        Mthread := TMyThread.Create(True);
        Mthread.Start;

        ThreadList.Add(Mthread);
        Form1.lbl2.Caption := I.ToString;
        TThread.Sleep(200);
      end;
    end).Start;

end;

 {批量暂停多个线程}
procedure TForm1.btn5Click(Sender: TObject);
begin

  TThread.CreateAnonymousThread(
    procedure
    var
      I: Integer;
    begin
      for I := 0 to ThreadList.Count do begin
        ThreadList[I].Suspended := True;
      end;
    end).Start;

end;

{批量继续多个线程}
procedure TForm1.btn6Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      I: Integer;
    begin
      for I := 0 to ThreadList.Count do begin
        ThreadList[I].Resume;
      end;
    end).Start;
end;

{批量终止多个线程}
procedure TForm1.btn7Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(
    procedure
    var
      I: Integer;
    begin
      for I := 0 to ThreadList.Count do begin
        ThreadList[I].FreeOnTerminate := True;
//      TerminateThread(ThreadList[I].Handle, 0);
      end;
    end).Start;
end;

end.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

# API

VCL应用下不需要引入额外的单元

参考地址:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms686736(v=vs.85)?redirectedfrom=MSDN


var
    { 用于接收线程返回句柄,也可以用DWORD }
    ThreadHandle: THandle;
    {线程ID}
    Tid: DWord;

    // 线程函数
function MyFun(p: Pointer): Integer; stdcall;
var
    i: Integer;
begin
    for i := 0 to 100 do begin
        Form1.Label1.caption := i.ToString;

        TTHread.sleep(100);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    if Button1.caption = '暂停' then begin
        // 挂起线程
        SuspendThread(ThreadHandle);
        Button1.caption := '恢复';

    end
    else begin
        // 激活线程
        ResumeThread(ThreadHandle);
        Button1.caption := '暂停';
    end;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

    // 创建并启动线程
    ThreadHandle := CreateThread(nil, 0, @MyFun, nil, 0, Tid);

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    // 终止线程
    TerminateThread(ThreadHandle, 0);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
多线程开篇
线程同步

← 多线程开篇 线程同步→

Theme by Vdoing | Copyright © 2013-2023 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×