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
事件处理程序。在这里,您可以处理线程完成时发生的事情。如果无法让代码在主线程中运行,请先调试代码以修复它。如果创建的代码已挂起,需要先启动,该怎么办?如果它在终止时被设置为自由呢?即使不是这样,我也不会推荐给我最坏的敌人。如果它被创建为暂停状态,需要先启动呢?如果它在终止时被设置为自由呢?即使不是这样,我也不会向我最坏的敌人推荐。