Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как узнать завершился ли поток 
V
    Опции темы
1Andrey1
Дата 8.9.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.9.2007

Репутация: 1
Всего: 4



Помогите пожалуйста разобраться что я делаю не так. В общем мне нужно вот что: запустить поток, который по завершению (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;
 
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 8.9.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



1Andrey1
Код

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

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

Попробуй, может сработает.. А так обычно используют всякие семафоры...
PM   Вверх
W4FhLF
Дата 9.9.2007, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Хендл потока знаешь знаешь? Тогда используй:

WaitForSingleObject(hThread, INFINITE);

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


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
1Andrey1
Дата 9.9.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.9.2007

Репутация: 1
Всего: 4



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


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

Не пинайте меня сильно пожалуйста, просто с потоками никогда не связывался, а литературы очень мало. 
PM MAIL ICQ   Вверх
Alexeis
Дата 9.9.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
1Andrey1
Дата 10.9.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 8.9.2007

Репутация: 1
Всего: 4



спасибо, разобрался
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.