Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > как узнать завершился ли поток


Автор: 1Andrey1 8.9.2007, 23:05
Помогите пожалуйста разобраться что я делаю не так. В общем мне нужно вот что: запустить поток, который по завершению (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;
 

Автор: Pakshin A. S. 8.9.2007, 23:17
1Andrey1, 
Код

    getinfohred := TMyhread.Create(FileName);
    getinfohred.FreeOnTerminate:=true;
    getinfohred.OnGetTag:=OnGetTag1;
    getinfohred.Resume; // Здесь только запускаем поток

и убирай из конструктора Resume.

Попробуй, может сработает.. А так обычно используют всякие семафоры...

Автор: W4FhLF 9.9.2007, 06:34
Хендл потока знаешь знаешь? Тогда используй:

WaitForSingleObject(hThread, INFINITE);

Когда функция выйдет из ожидания - поток уже завершит свою работу. 

Автор: 1Andrey1 9.9.2007, 10:20
Pakshin A. S., Если можно про флаги конкретнее, где именно их использовать. Чтото у меня ничего не получается


W4FhLF,  А как узнать хэндл потока?

Не пинайте меня сильно пожалуйста, просто с потоками никогда не связывался, а литературы очень мало. 

Автор: Alexeis 9.9.2007, 10:56
  Так у TThread есть событие OnTerminate. Обработчик OnTerminate - вызывается после завершения потока в контексте главного потока, так что не нуждается в синхронизации.

Автор: 1Andrey1 10.9.2007, 18:33
спасибо, разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)