写一个定义与myThread的OnTerminate事件一样的过程:myThreadTerminate,
在myThread[i]:=TmyThread.Create后,用这句:
myThread[i].OnTerminate := myThreadTerminate;for i:=0 to threadcount do
begin
mythread[i]:=tmythread.create;
myThread[i].OnTerminate := myThreadTerminate;
end;
在myThread[i]:=TmyThread.Create后,用这句:
myThread[i].OnTerminate := myThreadTerminate;for i:=0 to threadcount do
begin
mythread[i]:=tmythread.create;
myThread[i].OnTerminate := myThreadTerminate;
end;
在线程的execute
第一行插一句
freeOnTerminate := true;
在最后一行在补上一句
Form1.变量 := Form1.变量 + 1;
private
HandleFrm : integer;
step : integer;
public
constructor Create(handle:integer);
procedure Execute; override; end;
constructor TMyThread.Create(handle:integer);
begin
HandleFrm := handle;
FreeOnTerminate := True;
inherited Create(false);
end;
procedure TMyThread.Execute;
var
i : integer;
begin
inherited;
for i:= 0 to 10000 do
begin
step := i;
if step = 5000 then
begin
SendMessage(HanldeFrm,WM_SYSCOMMAND,SC_MINIMIZE,0);
//满足条件时发送消息,可以自己定制消息,然后在对应的文件实现消息处理函数
exit;//当然不一定退出;
end;
do sth;
end;
///////////////////////////////////////////////////////////////////////////
关于Form1的定义;
private
{ Private declarations }
ThreadCount : integer;
procedure ThreadDone(Sender: TObject);
.......
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
for i:=0 to ThreadCount - 1 do
begin
with TMythread.Create(Form1.handle) do
OnTerminate := ThreadDone;
end;
procedure TForm1.ThreadDone(Sender :TObject);
begin
Dec(ThreadCount);
if (ThreadCount = 0) then
ShowMessage('All Threads have been done!');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ThreadCount := 20;
end;
希望对你有所帮助!!!!
TMyThread = class(TThread)
private
FEvent: THandle;
public
constructor Create(Run: Boolean); override;
destructor Destroy; overrdie;
property Event: THandle read FEvent;
end;constructor TMyThread.Create(Run: Boolean);
begin
FEvent := CreateSemaphore(nil, 1);
inherited Create(Run);
end;destructor TMyThread.Destroy;
begin
CloseHandle(FEvent);
end;procedure TMyThread.Execute;
begin
//初始工作...
//初始完成了,通知Form1我进行线程循环了。Form1主线程可以继续工作了
ReleaseSemaphore(FEvent, 1);
//循环
end;
procedure TForm1.ThreadTerminate(Sender: TObject);
begin
//当每个线程完成Free时,触发这个事件。
Dec(FCount);
end;procedure TForm1.CreateMyThread;
var
Thread: TMyThread;
begin
Thread := TMyThread.Create(True);
Thread.OnTerminate := ThreadTerminate;
WaitForSingleObject(Thread.Event, 10000); //等Thread进行循环
FThreadList.Add(Thread);
Inc(FCount);
end; procedure Button1.onclick
begin
for I := 0 to ThreadCount do
CreateThread;
end;FCount: Integer其时没必要了,可以通过访问FThreadList.Count来知道多少个线程了。记住Free FThreadList所指的线程资源。
FThreadList: TList//指向TMyThreadprocedure FreeThread;
var I: Integer;
begin
for I:= 0 to FThreadList.Count - 1 do
begin
TMyThread(FThreadList[i]).Terminate;
TMyThread(FThreadLIst[I]).Free;
end;
FThreadList.Free;
end;