Multithreading 如何等待线程完成

Multithreading 如何等待线程完成,multithreading,delphi,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;

你好,这是我的主线:

 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然后执行线程时,主线程必须等待线程完成

我怎样才能等线程完成它的工作


Panel1包含加载GIF。

无法使用线程,但您可以

TUploadThread.Create(Self).WaitFor();

无法达到使用线程的目的,但您可以

TUploadThread.Create(Self).WaitFor();
我怎样才能等线程完成它的工作

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


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

相反,在线程创建过程中传输所有这些信息。如果需要从线程更新GUI,请使用或方法

我怎样才能等线程完成它的工作

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


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


相反,在线程创建过程中传输所有这些信息。如果需要从线程更新GUI,请使用或方法。

GUI组件只能从主线程访问。@LURD让我简单地问一下,如何在线程中压缩大型文件,在压缩操作完成后,对主线程说我完成了。当我试图压缩主线程时,程序崩溃。为线程添加一个
OnTerminate
事件处理程序。在这里,您可以处理线程完成时发生的事情。如果无法让代码在主线程中运行,请先调试代码以修复它。GUI组件只能从主线程访问。@LURD让我问一个简单的问题,如何在一个线程中压缩大型文件,在压缩操作完成后,对主线程说我完成了。当我试图压缩主线程时,程序崩溃。为线程添加一个
OnTerminate
事件处理程序。在这里,您可以处理线程完成时发生的事情。如果无法让代码在主线程中运行,请先调试代码以修复它。如果创建的代码已挂起,需要先启动,该怎么办?如果它在终止时被设置为自由呢?即使不是这样,我也不会推荐给我最坏的敌人。如果它被创建为暂停状态,需要先启动呢?如果它在终止时被设置为自由呢?即使不是这样,我也不会向我最坏的敌人推荐。