下面是程序原码,点击UsedThread按钮,显示循环变量,再点击UsedThread按钮,上一个线程为何不变化,好象停止了,显示的是第二次的循环变量,为何不是两个都同时运行?unit MyThreadPro;
interface
uses
Windows, Classes, Controls, StdCtrls ,Messages ,SysUtils , Graphics ,Forms,Dialogs ;
type
TForm1 = class(TForm)
UsedThread: TButton;
NoUsedThread: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure UsedThreadClick(Sender: TObject);
procedure NoUsedThreadClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
TrIPAborted:boolean=false;
xx:integer=10;
Form1: TForm1;
Sect1:TRTLCriticalSection;
implementation{$R *.DFM}//这是线程函数,它可以放在下面程序的任何地方function MyThreadFunc(P:pointer):Longint;stdcall;
var
i:integer;
DC:HDC;
S:string;
begin
EnterCriticalSection(Sect1); //进入临界区
DC:=GetDC(Form1.Handle);
for i:=0 to strtoint(form1.edit1.text) do begin
S:=Inttostr(i);
if TrIPAborted then break;
Textout(DC,10,xx,Pchar(S),length(S));
end;
ReleaseDC(Form1.Handle ,DC);LeaveCriticalSection(Sect1); //离开临界区
end;function MyThreadFunc1(P:pointer):Longint;stdcall;
var
i:integer;
DC1:HDC;
S:string;
begin
EnterCriticalSection(Sect1); //进入临界区
DC1:=GetDC(Form1.Handle);
showmessage(inttostr(dc1));
for i:=0 to strtoint(form1.edit1.text) do begin
S:=Inttostr(i);
if TrIPAborted then break;
Textout(DC1,10,xx,Pchar(S),length(S));
end;ReleaseDC(Form1.Handle ,DC1);
  LeaveCriticalSection(Sect1); //离开临界区
end;procedure TForm1.UsedThreadClick(Sender: TObject);
var
hThread,hThread1:Thandle;//定义一个句柄
ThreadID,ThreadID1:DWord;
begin
//创建线程,同时线程函数被调用
TrIPAborted:=false;
xx:=xx+30;
hthread:=CreateThread(nil ,0,@MyThreadfunc,nil,0,ThreadID);
xx:=xx+30;
hthread1:=CreateThread(nil ,0,@MyThreadfunc1,nil,0,ThreadID1);
hthread.
if hThread=0 then
messagebox(Handle ,'Didn’t Create a Thread',nil,MB_OK);
end;
procedure TForm1.NoUsedThreadClick(Sender: TObject);beginMyThreadfunc(nil);//没有创建线程时,直接调用线程函数end;procedure TForm1.Button1Click(Sender: TObject);
begin
TrIPAborted:=true;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
 InitializeCriticalSection(Sect1); //初始化临界区
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
 DeleteCriticalSection(Sect1); //释放临界区end;end.