я когда-то делал очередь потоков, чтобы исполнять их именно по очереди.
Код:
type
TThreadQueue = class(TObjectQueue)
private
FInProgress: Boolean;
FCurrentThread: TThread;
procedure OnThreadTerminate(Sender: TObject);
public
constructor Create;
destructor Destroy; override;
procedure ExecuteThreads;
procedure TerminateCurrentThread;
procedure TerminateAllThreads;
property InProgress: Boolean read FInProgress;
property CurrentThread: TThread read FCurrentThread;
end;