Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2007, 23:34   #1
1Andrey1
 
Регистрация: 08.09.2007
Сообщений: 3
Вопрос поток, который по завершению (Terminate) передает в основную форму информацию о файле

Помогите пожалуйста разобраться что я делаю не так. В общем мне нужно вот что: запустить поток, который по завершению (Terminate) передает в основную форму информацию о файле(при запуске я передаю ему имя файла, который нужно обработать), после того как он завершился мне нужно запустить его еще несколько раз. Вот здесь у меня и проблемма. Как узнать что поток уже завершился? Дальше я приведу примерный код, скажите что я делаю не так?

Код:

//Это код самого потока

unit GetInfo;

interface
uses
  Classes, MPEGaudio, ID3v1, ID3v2, dialogs;

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;
1Andrey1 вне форума Ответить с цитированием
Старый 09.09.2007, 19:50   #2
ZMeJ
шарящий
 
Регистрация: 09.09.2007
Сообщений: 9
По умолчанию

можно сделать чтобы поток при завершении посылал сообщение гл. форме программы, в которой передавал параметры завершения, нпр:
PostMessage(хэндл формы,WM_USER+2250,Integer(хэндл потока),
integer(pChar('имя файла'));
ZMeJ вне форума Ответить с цитированием
Старый 09.09.2007, 20:17   #3
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

В OnExecute написан бред! На кой там Terminate?? Это просто там ненужный оператор в данном случае. Для передачи в данном случае посылка сообщений не обязательно, достаточно написать обработик события OnTerminate.
still_alive вне форума Ответить с цитированием
Старый 09.09.2007, 23:14   #4
1Andrey1
 
Регистрация: 08.09.2007
Сообщений: 3
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
В OnExecute написан бред! На кой там Terminate?? Это просто там ненужный оператор в данном случае. Для передачи в данном случае посылка сообщений не обязательно, достаточно написать обработик события OnTerminate.
Я просто немного упростил свою процедуру execute, она выглядит примерно так:

if tag v1 then
begin
получаем информацию
Terminated;
end;
if tag v2 then
begin
получаем информацию
Terminated;
end;


Или логичнее там ставить "exit"?
1Andrey1 вне форума Ответить с цитированием
Старый 10.09.2007, 09:01   #5
Ring0Sn
Форумчанин
 
Аватар для Ring0Sn
 
Регистрация: 06.09.2007
Сообщений: 239
По умолчанию

Цитата:
Сообщение от 1Andrey1 Посмотреть сообщение
Как узнать что поток уже завершился
В классе TThread есже евент OnTerminate =)
перед execute присвой ему свой обработчик

Последний раз редактировалось Ring0Sn; 10.09.2007 в 09:03.
Ring0Sn вне форума Ответить с цитированием
Старый 10.09.2007, 19:40   #6
1Andrey1
 
Регистрация: 08.09.2007
Сообщений: 3
По умолчанию

спасибо, разобрался
1Andrey1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запрос который бы подсчитывал количество полных лет начиная с того года который указан в данных мне базах PereCCC Помощь студентам 8 15.05.2008 16:24
Как узнать информацию о PE файле Smoke Win Api 5 02.10.2007 13:10
как из dll передавать данные в основную программу? andrey4623 Общие вопросы Delphi 5 06.08.2007 10:15
info video - получить информацию о видео файле Toxa Общие вопросы Delphi 1 04.12.2006 17:02