분리 된 스레드에서 함수를 실행하고 스레드가 완료 될 때까지 기다려야합니다.동기화 사용 중 문제
Procedure Search;
begin
CallA;
CallB;
end;
이 수정 된 기능입니다 : : 스레드 위의 코드는 작동하지 않는 이유
이Procedure Search;
var
testMyThread: TMyThread;
Done: Boolean;
begin
// create a new thread to execute CallA
testMyThread:=TMyThread.Create(False,Done);
WaitForSingleObject(testMyThread.Handle, INFINITE);
if not Done then
begin
TerminateThread(testMyThread.Handle, 0);
end
else;
CallB;
end
unit uMyThread;
interface
uses classes;
type
TMyThread = class(TThread)
private
{ Private declarations }
FDone: ^boolean;
protected
procedure Execute; override;
public
constructor Create(const aSuspended: boolean; var Done: boolean);
procedure CallA;
end;
implementation
uses uMain;
constructor TMyThread.Create(const aSuspended: boolean;
var Done: boolean);
begin
inherited Create(aSuspended);
FDone := @Done;
end;
procedure TMyThread.CallA;
begin
// enumurating several things + updating the GUI
end;
procedure TMyThread.Execute;
begin
inherited;
Synchronize(CallA); // << the problem
FDone^ := true;
end;
end.
당신이 말해 줄 수는 (CallA
가 실행되고 있지 않습니다 예를 들어
, 여기에 원래의 기능입니다) Synchronize
을 TMyThread.Execute
안에 넣으면?
이것은 실제로 해결책이지만 폼을 스레드 대기를 차단하지 않도록 조정해야합니다. 결국, 현재 최종 효과는 변경된 것이 없으며 단지 합병증 만 추가되었습니다. 스레드가 시작되어야하고 IT가 작업을 수행해야하며 결국 UI가 업데이트됩니다. 모든 검색 절차에 포함되어서는 안됩니다. – mj2008