楼上很多人都说了用信号灯的方式, 我就贴段代码参考一下吧,呵呵function MyThreadFun(p: Pointer): DWORD; stdcall; var i,y: Integer; begin Inc(f); y := 20 * f; if WaitForSingleObject(hSemaphore, INFINITE) = WAIT_OBJECT_0 then begin for i := 0 to 1000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(20, y, IntToStr(i)); Form1.Canvas.Unlock; Sleep(1); {以免 Canvas 忙不过来} end; end; ReleaseSemaphore(hSemaphore, 1, nil); Result := 0; end;
比如把A、B放入一个列表当中。当信号量有信号时就去列表中取出线程A开始执行。
当线程A执行完成后。再次置信号量。然后再从列表中取出下一下线程B执行。
以此类推。
var
i,y: Integer;
begin
Inc(f);
y := 20 * f;
if WaitForSingleObject(hSemaphore, INFINITE) = WAIT_OBJECT_0 then
begin
for i := 0 to 1000 do
begin
Form1.Canvas.Lock;
Form1.Canvas.TextOut(20, y, IntToStr(i));
Form1.Canvas.Unlock;
Sleep(1); {以免 Canvas 忙不过来}
end;
end;
ReleaseSemaphore(hSemaphore, 1, nil);
Result := 0;
end;