您的位置:首页 > 编程语言 > Delphi

Delphi TThread 和 CreateThread 简单区别

2017-09-30 17:15 309 查看
(DL&&KK快快 原创)

一、写代码的时候碰到一个线程内存泄漏的问题:

描述:

创建线程: Delphi 自带的 TThread 类

强制结束: TerminateThread

结果 : 会造成内存泄漏。

创建线程 : CreateThread

强制结束:TerminateThread

结果 : 不会造成内存泄漏。

二、若有CreateThread 的线程函数里面有需要动态分配内存的情况,则需要将 需要动态分配和释放内存放在线程函数外面,不能放在函数里面。若放在里面,线程函数自动结束时会造成内存泄漏,但是使用TerminateThread强制结束又没有内存泄漏。(这是一个很奇怪的现象,大家可以参照一下。可能我自己做的有不对的,也可以告诉我,一起学习的哈)

三、简述一下其中两个函数的使用方式

CreateThread(nil, 0, @线程函数名, nil(线程函数的参数,我这里无参就用的nil,若需要参数,网上有例子,大家可以看一下), 0, id(TerminateThread强制结束时需要用到));

注:使用CreateThread,一定要使用CloseHandle;

TerminateThread(id, 0(超时,我一般就设置立即结束为0));

简单放置一段代码哈,里面有些小细节我会在后面注释的

type
TForm1 = class(TForm)
end;
procedure IPNetPrinter;stdcall; //此声明要放在implementation之前,类声明的end之后,且必须加上stdcall
var
Form1: TForm1;
Buf : Pointer;
implementation
procedure IPNetPrinter;
begin
//需要在线程里面执行的代码
//使用到了Buf
IsOneFinished  := True;//我自己设置的线程结束标记,是全局变量,具体看需求
end;

procedure TForm1.SearOne;
var
TimeOut : Cardinal;
id      : Cardinal;
ThHand  : THandle;
begin
try
//用 createthread 来创建线程并且
TimeOut := GetTickCount;
GetMem(Buf, 8192); //这样分配,在线程自动结束时才不会内存泄漏
ThHand := CreateThread(nil, 0, @IPNetPrinter, nil, 0, id);
CloseHandle(ThHand);
//上两句可以合并为CloseHandle(CreateThread(nil, 0, @IPNetPrinter, nil, 0, id));
while True do
begin
Sleep(10);
if (GetTickCount - TimeOut) > 90 * 1000 then
begin
TerminateThread(id, 0);
Break;
end;
Application.ProcessMessages;
if IsOneFinished then
begin
Break;
//线程自己结束
end;
finally
FreeMem(Buf);
end;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: