Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запустить TThread повторно?


Страницы:   1 2 3 4 5

Cobalt ©   (2009-02-21 15:14:00) 

Есть у меня один поток, который обходит каталоги, считает контрольные суммы файлов.
Но каждый раз после окончания работы приходится пересоздавать объект :-(

Вопрос такой: можно ли после окончания исполнения потока повторно использовать объект TThread ?

Например, запустив его метод Create - будет ли создан новый объект TThread, который повиснет в памяти, или он только отработает свой код, заново запустив WinAPI-ый поток исполняться?


Riply   (2009-02-21 21:22:00) [81]

> [0] Cobalt ©   (21.02.09 15:14)
> Вопрос такой: можно ли после окончания исполнения потока повторно использовать объект TThread ?

Например, не выходить из него, а ожидать события или сообщения.

> [7] Медвежонок Пятачок ©   (21.02.09 18:42)
> ломает create что ли вызвать еще раз?

Если бы ты знал, как "ломает", ибо это довольно "тяжелая" для системы операция (создание нити).


Медвежонок Пятачок   (2009-02-21 21:10:00) [82]

Посмотри простой пример:

type

TThrProc=procedure; .....


этот пример лучше никому не показывать, а самому втихаря переться от своей крутости.
За какой надобностью здесь потребовалось использовать евенты?


Медвежонок Пятачок   (2009-02-21 21:05:00) [83]

в чем-то ты прав. я не пытался ответить на них (вопросы) потому что таких вопросов у меня не возникало никогда


Тын-Дын   (2009-02-21 20:54:00) [84]


> детские какие-то вопросы.


Вряд ли ты пытался на них для себя кодом ответить.


Медвежонок Пятачок   (2009-02-21 18:42:00) [85]

в конце execute postmessage наружу и по приемеу resume ему снаружи

либо тупо цикл в сам execute

детские какие-то вопросы.

"повторно использовать"

ломает create что ли вызвать еще раз?


Cobalt   (2009-02-21 18:18:00) [86]

> DVM ©   (21.02.09 17:28) [5]
Так еще ж нужно знать, что он обошел всё, и всё подсчитал.
И чтобы для этого не добавлять кучу дополнительных полей...


DVM   (2009-02-21 17:28:00) [87]


> Есть у меня один поток, который обходит каталоги, считает
> контрольные суммы файлов.
> Но каждый раз после окончания работы приходится пересоздавать
> объект :-(
>

А добавить в него бесконечный цикл не судьба? Ну конечно не совсем бесконечный, чтобы возможность завершения была, но не самопроизвольного.
И пусть он себе ходит по каталогам и делает что тебе надо.


Тын-Дын   (2009-02-21 16:56:00) [88]


> для этого можно использовать TThread или любой другой класс,
>  вызывая его метод Execute из другого потока, созданного
> к примеру через BeginThread или тот же TThread.


Что сказать-то вообще хотел?


> Cobalt ©   (21.02.09 15:14) 



> Вопрос такой: можно ли после окончания исполнения потока
> повторно использовать объект TThread ?


Посмотри простой пример:

type

 TThrProc=procedure;

 TThrTest=class(TThread)
 private
   FThrProc: TThrproc;
   FEvent: THandle;
   FExecEvent: THandle;
 protected
   procedure Execute; override;
 public
   constructor Create;
   destructor Destroy; override;

   function Exec(Proc: TThrProc): Boolean;
   procedure EndThread;
 end;

var
 Thr: TThrTest;

implementation

procedure ProcThr1;
begin
 MessageBox(0,'qqq','qqq',MB_OK);
end;

procedure ProcThr2;
begin
 Sleep(1000);
 MessageBox(0,'sss','sss',MB_OK);
end;

{ TThrTest }

constructor TThrTest.Create;
begin
 inherited Create(True);
 FEvent := CreateEvent(nil,False,False,'');
 FExecEvent := CreateEvent(nil,False,False,'');
 FreeOnTerminate := True;
 Resume;
 WaitForSingleObject(FExecEvent, INFINITE);
 SetEvent(FExecEvent);
end;

destructor TThrTest.Destroy;
begin
 CloseHandle(FEvent);
 CloseHandle(FExecEvent);
 inherited;
end;

procedure TThrTest.Execute;
begin
 SetEvent(FExecEvent);
 while not Terminated do
 begin
   if Terminated then Exit;
   try
     if Assigned(FThrProc) then FThrProc;
     FThrProc := nil;
   except
     //
   end;
   SignalObjectAndWait(FExecEvent,FEvent,INFINITE,False);    
 end;
end;

function TThrTest.Exec(Proc: TThrProc): Boolean;
begin
 Result := False;
 if WaitForSingleObject(FExecEvent,0)=WAIT_OBJECT_0 then
 begin
   Result := True;
   FThrProc := Proc;
   SetEvent(FEvent);
 end;

end;

procedure TThrTest.EndThread;
begin
 Terminate;
 SetEvent(FEvent);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if not Assigned(Thr) then Thr := TThrTest.Create;
 if not Thr.Exec(@ProcThr1) then ShowMessage('Busy');
 Sleep(2000);
 if not Thr.Exec(@ProcThr2) then ShowMessage('Busy');

end;


Eraser   (2009-02-21 15:50:00) [89]

> [2] Cobalt ©   (21.02.09 15:23)

для этого можно использовать TThread или любой другой класс, вызывая его метод Execute из другого потока, созданного к примеру через BeginThread или тот же TThread.


Cobalt   (2009-02-21 15:23:00) [90]

Хотелось бы видеть нечто вроде
FireThread
проверяя завершение потока по Terminated
не удаляя существующего объекта.


Eraser   (2009-02-21 15:19:00) [91]

> Вопрос такой: можно ли после окончания исполнения потока
> повторно использовать объект TThread ?

можно, и не только после окончания.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо