![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запустить TThread повторно?
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 ?
можно, и не только после окончания.