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