Помогите пожалуйста разобраться что я делаю не так. В общем мне нужно вот что: запустить поток, который по завершению (Terminate) передает в основную форму данные(при запуске я передаю ему данные которые нужно обработать), после того как он завершился мне нужно запустить его еще несколько раз. Вот здесь у меня и проблемма. Как узнать что поток уже завершился? Дальше я приведу примерный код, скажите что я делаю не так?
| Код |
//Это код самого потока
unit GetInfo;
interface uses Classes;
type
ThreadDemo = class;
TagRecord=record tagexist,valid:boolean; title,artist,album,year,genre,comments,bitrate,samplerate,path,name:string; end;
TGetTagEvent=procedure(const info:tagrecord)of object;
TMyhread = class(TThread) private FOnGetTag:TGetTagEvent; Finfo:string; procedure setinfo; { Private declarations } protected name: string; procedure Execute; override; public constructor create(const FileName: WideString); destructor Destroy; property info :string read FInfo write Finfo; property OnGetTag : TGetTagEvent read FOnGetTag write FOnGetTag; end;
var getinfohred: TMyhread; tagr:tagrecord;
implementation
uses Unit1, SysUtils;
constructor ThreadDemo.create(const FileName: WideString); begin inherited Create(true); FreeOnTerminate := True; name:=FileName; resume; end;
destructor ThreadDemo.Destroy; begin inherited; end;
procedure ThreadDemo.Execute; begin // Тут собственно получение информации из файла(заполняется рекорд "tagr") synchronize(setinfo); Terminate; end;
procedure ThreadDemo.setinfo; begin if assigned(FOnGetTag) then begin FOnGetTag(tagr); end;
end;
//А это код главной формы
var getinfohred : TMyhread;
//Весь код я приводить не буду, но идея в том что я запускаю поток, передав ему имя файла //поток возвращает мне рекорд с информацией об этом файле, мне нужно подождать пока он //завершится и запустить следующий поток, но чтото у меня здесь не получается
for i:=0 to filelist.count-1 do begin //Вот здесь бы мне нужно подождать завершения потока, если он есть //Что то типа //while assigned(getinfohred) do // begin // sleep(10); // end; //Но это не работает
getinfohred := TMyhread.Create(FileName); getinfohred.FreeOnTerminate:=true; getinfohred.OnGetTag:=OnGetTag1; //В процедуре "OnGetTag1" главной формы идет обработка данных, которые вернул поток end;
|
|