Господа, подскажите, как вызвать друг за другом три процедуры с потоками внутри, но так - чтобы вызов каждой процедуры (начиная со второй) зависел от результатов предыдущей процедуры?
Поясняю примером:
procedure TForm1.Button1Click(Sender: TObject);
begin
FirstThread;
SecondThread;
ThirdThread;
end;
procedure TForm1.FirstThread;
var
I: Integer;
begin
Memo1.Lines.Add('First Begin: ' + TimeToStr(Now));
I := 0;
TTask.Run(
procedure
begin
while (I < 300000000) do
Inc(I);
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Memo1.Lines.Add('First Thread: ' + TimeToStr(Now));
end)
end);
Memo1.Lines.Add('First End: ' + TimeToStr(Now));
end;
procedure TForm1.SecondThread;
var
I: Integer;
begin
Memo1.Lines.Add('Second Begin: ' + TimeToStr(Now));
I := 0;
TTask.Run(
procedure
begin
while (I < 800000000) do
Inc(I);
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Memo1.Lines.Add('Second Thread: ' + TimeToStr(Now));
end)
end);
Memo1.Lines.Add('Second End: ' + TimeToStr(Now));
end;
procedure TForm1.ThirdThread;
var
I: Integer;
begin
Memo1.Lines.Add('Third Begin: ' + TimeToStr(Now));
I := 0;
TTask.Run(
procedure
begin
while (I < 900000000) do
Inc(I);
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Memo1.Lines.Add('Third Thread: ' + TimeToStr(Now));
end)
end);
Memo1.Lines.Add('Third End: ' + TimeToStr(Now));
end;
В Memo попадают сначала "Begin End" и только потом - First Thread, Second Thread, Third Thread.
Если вставить внутри процедур булевы переменные (от которых должен зависеть вызов следующей процедуры), то у нас не получится реализовать задуманное, потому что все три процедуры отработают друг за другом, невзирая на результат в потоках.
Вопрос
DMS
Господа, подскажите, как вызвать друг за другом три процедуры с потоками внутри, но так - чтобы вызов каждой процедуры (начиная со второй) зависел от результатов предыдущей процедуры?
Поясняю примером:
procedure TForm1.Button1Click(Sender: TObject); begin FirstThread; SecondThread; ThirdThread; end; procedure TForm1.FirstThread; var I: Integer; begin Memo1.Lines.Add('First Begin: ' + TimeToStr(Now)); I := 0; TTask.Run( procedure begin while (I < 300000000) do Inc(I); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('First Thread: ' + TimeToStr(Now)); end) end); Memo1.Lines.Add('First End: ' + TimeToStr(Now)); end; procedure TForm1.SecondThread; var I: Integer; begin Memo1.Lines.Add('Second Begin: ' + TimeToStr(Now)); I := 0; TTask.Run( procedure begin while (I < 800000000) do Inc(I); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('Second Thread: ' + TimeToStr(Now)); end) end); Memo1.Lines.Add('Second End: ' + TimeToStr(Now)); end; procedure TForm1.ThirdThread; var I: Integer; begin Memo1.Lines.Add('Third Begin: ' + TimeToStr(Now)); I := 0; TTask.Run( procedure begin while (I < 900000000) do Inc(I); TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Lines.Add('Third Thread: ' + TimeToStr(Now)); end) end); Memo1.Lines.Add('Third End: ' + TimeToStr(Now)); end;
В Memo попадают сначала "Begin End" и только потом - First Thread, Second Thread, Third Thread.
Если вставить внутри процедур булевы переменные (от которых должен зависеть вызов следующей процедуры), то у нас не получится реализовать задуманное, потому что все три процедуры отработают друг за другом, невзирая на результат в потоках.
Ссылка на комментарий
13 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.