如何等待线程完成

时间:2018-01-29 08:12:29

标签: multithreading delphi

你好这是我的主线:

 procedure TShareWithForm.btnShareClick(Sender: TObject);
begin
  Panel1.Visible:= True;

  if SelectedUserID = '' then
  begin
    Exit;
  end;

  TUploadThread.Create(Self);

  Panel1.Visible:= False;

    FormMain.CaseListMyShares;
    Close;
  end;
end;

我的线程执行方法:

procedure TUploadThread.Execute;
var
  i: Integer;
  CaseId: String;
  tmpFilePath: String;

  curr_cases: Integer;

  obContextIO: TContextIO;

  workingDir: String;
begin

  obShareApiAdapter.IdHTTPWorkBeginEvent:= ShareWithForm.IdHTTP1WorkBegin;
  obShareApiAdapter.IdHTTPWorkEvent:= ShareWithForm.IdHTTP1Work;
  obShareApiAdapter.IdHTTPWorkEndEvent:= ShareWithForm.IdHTTP1WorkEnd;

  curr_cases:= -1;
  SetLength(FForm.SelectedCases, FForm.ShareGrid.RowCount -1);

  for i := 1 to FForm.ShareGrid.RowCount - 1 do
  begin
    CaseId:= FForm.ShareGrid.Cells[0, i];

    if CaseId = '' then
      continue;

    if FormMain.AExists then
        workingDir:= obPath.ServerData + CaseId
    else
        workingDir:= obPath.CaseBackupPath + '\' + CaseId;

    TZipFile.ZipDirectoryContents(obPath.CaseTmpPath + '\' + CaseId + '.zip', workingDir);
    Inc(curr_cases);
    FForm.SelectedCases[curr_cases].patientCase:= CaseId;
    FForm.SelectedCases[curr_cases].rawFile:= obShareApiAdapter.AddNewFile(obPath.CaseTmpPath + '\' + CaseId + '.zip');
  end;
end;

当我开始线程时,我想等待线程完成然后运行此代码:

Panel1.Visible:= False;

    FormMain.CaseListMyShares;
    Close;

但是线程并行运行.. 当我显示Panel1然后线程执行时,mainthread必须等待线程完成。

我如何等待线程完成其工作?

Panel1包含一个加载GIF。

2 个答案:

答案 0 :(得分:5)

  

我如何等待线程完成其工作?

使用事件驱动设计。为您的线程添加一个OnTerminate事件处理程序,您可以在其中处理线程完成后将发生的事情。

注意: 您的线程执行处理程序有几个缺陷。所有这些都是由于GUI组件的直接访问。这是不允许的。

相反,在创建线程期间传输所有信息。如果您需要从线程更新GUI,请使用SynchronizeQueue方法。

答案 1 :(得分:-1)

违背了使用线程的目的,但你可以

TUploadThread.Create(Self).WaitFor();