你好这是我的主线:
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。
答案 0 :(得分:5)
我如何等待线程完成其工作?
使用事件驱动设计。为您的线程添加一个OnTerminate事件处理程序,您可以在其中处理线程完成后将发生的事情。
注意: 您的线程执行处理程序有几个缺陷。所有这些都是由于GUI组件的直接访问。这是不允许的。
相反,在创建线程期间传输所有信息。如果您需要从线程更新GUI,请使用Synchronize或Queue方法。
答案 1 :(得分:-1)
违背了使用线程的目的,但你可以
TUploadThread.Create(Self).WaitFor();