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));
简单放置一段代码哈,里面有些小细节我会在后面注释的
一、写代码的时候碰到一个线程内存泄漏的问题:
描述:
创建线程: 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;
相关文章推荐
- AfxBeginThread和CreateThread具体区别
- 【转】AfxBeginThread和CreateThread具体区别
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- 在windows上,AfxBeginThread 和 CreateThread 创建的线程是有一点区别的
- 2010.8.17 CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- CreateThread,_beginthread与AfxbeginThread 的区别 (转载自jogholy的博客)
- 多线程 AfxBeginThread 与 CreateThread 的区别
- AfxBeginThread和CreateThread具体区别
- AfxBeginThread和CreateThread具体区别
- _beginthreadex与createthread和AfxBeginThread的区别
- php下载时VC各版本的区别和Non Thread Safe、Thread safe的简单辨析
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- AfxBeginThread和CreateThread具体区别
- Thread、Runnable、Callable三种创建线程的简单示例及区别简介
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- 多线程 AfxBeginThread 与 CreateThread 的区别
- windows 多线程: CreateThread、_beginthread、_beginthreadex、AfxBeginThread 的区别
- CreateThread 、Afxbeginthread 和 _beginThread 的区别
- 多线程 AfxBeginThread 与 CreateThread 的区别