unit uNoCriticalSection; { 能不能让它们别打架, 一个完了另一个再来? 这就要用到多线程的同步技术. 前面说过, 最简单的同步手段就是 "临界区". 先说这个 "同步"(Synchronize), 首先这个名字起的不好, 我们好像需要的是 "异步"; 其实异步也不准确... 管它叫什么名字呢, 它的目的就是保证不冲突、有次序、都发生. "临界区"(CriticalSection): 当把一段代码放入一个临界区, 线程执行到临界区时就独占了, 让其他也要执行此代码的线程先等等; 这和前面用的 Lock 和 UnLock 差不多; 使用格式如下: var CS: TRTLCriticalSection; //声明一个 TRTLCriticalSection 结构类型变量; 它应该是全局的 InitializeCriticalSection(CS); //初始化 EnterCriticalSection(CS); //开始: 轮到我了其他线程走开 LeaveCriticalSection(CS); //结束: 其他线程可以来了 DeleteCriticalSection(CS); //删除: 注意不能过早删除 } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; ListBox2: TListBox; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var CS: TRTLCriticalSection; { no Critical Section } function MyThreadFun(p: Pointer): DWord; stdCall; var i: integer; begin for i := 0 to 10 do begin Form1.ListBox1.Items.Add(IntTostr(i)); end; end; procedure TForm1.Button1Click(Sender: TObject); var ID: DWORD; begin windows.CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); windows.CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); windows.CreateThread(nil, 0, @MyThreadFun, nil, 0, ID); end; { with Critical Section } function MyThreadFun2(p: Pointer):DWord; stdcall; var i: integer; begin // if CS = NIL then // begin // showmessage("No INIT CS!"); // Exit; // end; windows.EnterCriticalSection(CS); for i := 0 to 10 do begin Form1.ListBox2.Items.Add(IntTostr(i)); end; windows.LeaveCriticalSection(CS); end; procedure TForm1.Button2Click(Sender: TObject); var ID: DWORD; begin windows.CreateThread(nil, 0, @MyThreadFun2, nil, 0, ID); windows.CreateThread(nil, 0, @MyThreadFun2, nil, 0, ID); windows.CreateThread(nil, 0, @MyThreadFun2, nil, 0, ID); end; procedure TForm1.Button3Click(Sender: TObject); begin windows.InitializeCriticalSection(CS); end; procedure TForm1.Button4Click(Sender: TObject); begin windows.DeleteCriticalSection(CS); end; end.