用, 上面是继承为 TMyThread.
继承 TThread 主要就是实现抽象方法 Execute(把我们的代码写 在里面), 等我们的 TMyThread 实例化后, 首先就会执行 Execute 方 法中的代码.
按常规我们一般这样去实例化:
procedure TForm1.Button1Click(Sender: TObject); var MyThread: TMyThread; begin MyThread := TMyThread.Create(False); end;
因为 MyThread 变量在这里毫无用处(并且编译器还有提示), 所 以不如直接写做 TMyThread.Create(False);
我们还可以轻松解决一个
问题, 如果: TMyThread.Create(True) ?
procedure TForm1.Button1Click(Sender: TObject); var MyThread: TMyThread; begin MyThread := TMyThread.Create(True); MyThread.Resume; end; //可简化为: procedure TForm1.Button1Click(Sender: TObject);
begin with TMyThread.Create(True) do Resume; end;
使用 TThread 类时, Delphi 有提供的模板, 但用 IDE 写代码很 方便, 我重写一遍录下来给大家看:
多线程编程(1) - 先入门再说
期间使用了 Ctrl+J、Shift+Ctrl+C、Ctrl+Alt+P 等快捷键.
重要的修正与补充: 在 TThread 类的例子中, 应该有这句: FreeOnTerminate := True; (原来漏掉, 代码中已加上; 但动画加不上 了).
先说它什么意思:
类 Create 了就要 Free;
但 TThread(的子类) 有特殊性, 很多时候我们不能确定新建的线 程什么时候执行完(也就是什么时候该释放);
如果线程执行完毕自己知道释放就好了, 所以 TThread 给了一个 布尔属性 FreeOnTerminate, 如果为 True, 线程执行完毕后就会自释 放.
我怎么会忽略了这么重要的问题呢? 原因有二:
1、我一直在追求最精炼的代码;
2、我手头上不只一本书上介绍说: FreeOnTerminate 的默认值是 True(错误!), 经落实, 应该是 False, 起码在
Delphi 2007 和 2009 中是这样; 或许以前的某个版本和现在不一样 多线程编程(2) - 从 CreateThread 说起。
function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD; {安全设置} {堆栈大小}
lpStartAddress: TFNThreadStartRoutine; {入
口函数} lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD ): THandle; stdcall; {函数参数} {启动选项} {输出线程 ID } {返回线程句柄}
在 Windows 上建立一个线程, 离不开 CreateThread 函数;
TThread.Create 就是先调用了 BeginThread (Delphi 自定义的), BeginThread 又调用的 CreateThread.
既然有建立, 就该有释放, CreateThread 对应的释放函数是: ExitThread, 譬如下面代码:
procedure TForm1.Button1Click(Sender: TObject); begin ExitThread(0); {此句即可退出当前程序, 但不建议这样使用} end;
代码注释:
当前程序是一个进程, 进程只是一个
工作环境, 线程是工作者;
每个进程都会有一个启动线程(或叫主线程), 也就是说: 我们之 前大量的编码都是写给这个主线程的;
上面的 ExitThread(0); 就是退出这个主线程;
系统不允许一个没有线程的进程存在, 所以程序就退出了.
另外: ExitThread 函数的参数是一个退出码, 这个退出码是给之 后的其他函数用的, 这里随便给个无符号整数即可.
或许你会说: 这个 ExitThread 挺好用的; 其实不管是用 API 还 是用 TThread 类写多线程, 我们很少用到它; 因为:
1、假如直接使用 API 的 CreateThread, 它执行完入口函数后会 自动退出, 无需 ExitThread; 2、 TThread 类建立的线程又绝不能使用 ExitThread 退出; 因为使 用 用 TThread 建立线程时会同时分配更多资源(譬如你自定义的成员、 还 有它的祖先类(TObject)分配的资源等等), 如果用 ExitThread 给草 草退出了, 这些资源将得不到释放而导致内存泄露. 尽管 Delphi 提 供了 EndThread(其内部调用 ExitThread), 这也不需要我们手动操作 (假如非要手动操作也是件很麻烦的事情, 因为很多时候你不知道线程 是什么时候执行完毕的).
除了 CreateThread, 还有一个 Cre