![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запустить TThread повторно?
Cobalt © (2009-02-21 15:14:00)Есть у меня один поток, который обходит каталоги, считает контрольные суммы файлов.
Но каждый раз после окончания работы приходится пересоздавать объект :-(
Вопрос такой: можно ли после окончания исполнения потока повторно использовать объект TThread ?
Например, запустив его метод Create - будет ли создан новый объект TThread, который повиснет в памяти, или он только отработает свой код, заново запустив WinAPI-ый поток исполняться?
Медвежонок Пятачок (2009-02-22 02:05:00) [41]я же показал уже
Тын-Дын (2009-02-22 02:03:00) [42]
> если это консоль, то мне вообще странно применение нитки
А что тут странного?
Потоки работают в любом прложении.
> отработала обработка и readlnДа/Нет/Не знаю
Непонятно, однако.
Всё-таки хотелось бы видеть код, который реализует эти простейшие функции - выполнение процедуры в отдельном потоке, ожидание, передача новой процедуры для выполнения, корректное завершение.
Медвежонок Пятачок (2009-02-22 01:56:00) [43]А почему ты думаешь, что обмен может быть только с потоками, в которых окна есть?
если это консоль, то мне вообще странно применение нитки
отработала обработка и readln
Да/Нет/Не знаю
Тын-Дын (2009-02-22 01:52:00) [44]
> предлагаешь экономить на Create
Экономия не на Create, а на CreateThread.
Тын-Дын (2009-02-22 01:51:00) [45]
> Медвежонок Пятачок © (22.02.09 01:47) [45]
> и чего?предлагаешь экономить на Create в то время как считаешь
> crc у дюжины файлов фик знает какого размера и надеешься
> дофига выиграть?
Это типичная задача для пула потоков.
1. Если считать CRC у пары миллионов мелких файлов на диске, тем более, если это сетевой диск, выигрыш в скорости будет в десятки раз.
2. Про дюжину файлов можно говорить, если они находятся на дискете, что несколько неудобно.
Тын-Дын (2009-02-22 01:48:00) [46]+вопрос
А почему ты думаешь, что обмен может быть только с потоками, в которых окна есть?
Медвежонок Пятачок (2009-02-22 01:47:00) [47]и чего?
предлагаешь экономить на Create в то время как считаешь crc у дюжины файлов фик знает какого размера и надеешься дофига выиграть?
Тын-Дын (2009-02-22 01:46:00) [48]+ обрати внимание на задачу из топика.
Тын-Дын (2009-02-22 01:45:00) [49]
> Медвежонок Пятачок © (22.02.09 01:39) [42]
В твоём коде единственное, что делаеся - выполняется всё время один и тот же цикл. Причём непрерывно.
Если ты смотрел код в [4], то мог заметить, что в нём:
1. Поток после выполнения задания останавливается и ждёт появления новой задачи.
2. Для выполнения можно передавать разные функции - без пересоздания потока.
Медвежонок Пятачок (2009-02-22 01:39:00) [50]procedure TBearPigletThread.Execute;
var i : integer; NeedRun : boolean;
begin
while not Terminated do
begin
if fNeedRun then
for i := 1 to 10 do
begin
PostMessage(fHandle,WM_TEST,0,i);
Sleep(300);
end;
else
Sleep(300);
i := SendMessage(fHandle,WM_TEST,1,0);
if i := 0 then Break else fNeedRun := i = 1;
end;
end;
Тын-Дын (2009-02-22 01:27:00) [51]
> никаких евентов здесь не надо.
Не надо так не надо.
Без эвентов покажи.
Тын-Дын (2009-02-22 01:26:00) [52]
> какая разница?
>зациклить execute и будет тоже самое.
Что значит - какая разница?
Покажи, как зациклишь.
Этот код в принципе не рабочий.
Ты рабочий код приведи.
Медвежонок Пятачок (2009-02-22 01:19:00) [53]какая разница?
зациклить execute и будет тоже самое.
никаких евентов здесь не надо.
переход в начало цикла или брейк - по результату SendMessage
Тын-Дын (2009-02-22 01:14:00) [54]
> if t = nil then TBearPigletThread.CreateIt(Handle) else
> t.Resume;
Можно пояснить, что здесь происходит?
Переменная tвроде бы не была кроме как nilпроинициализирована?
Медвежонок Пятачок (2009-02-22 01:10:00) [55]ПТоток/нить на этому завершает своё существование.
А ты случаем не преподаватель информатики?
Что-то вдруг подумалось.
Медвежонок Пятачок (2009-02-22 01:09:00) [56]Где повторная?
Под баттоном номер один.
Тын-Дын (2009-02-22 01:08:00) [57]Метод Execute заканчивает работу после одного прохода. ПТоток/нить на этому завершает своё существование.
Тын-Дын (2009-02-22 01:07:00) [58]Хм.
И где здесь повторная используемость?
Медвежонок Пятачок (2009-02-22 01:02:00) [59]На.
Вот нитка
constructor TBearPigletThread.CreateIt(AHandle: THandle);
begin
inherited Create(True);
fHandle := AHandle;
FreeOnTerminate := False;
Resume;
end;
procedure TBearPigletThread.Execute;
var i : integer;
begin
for i := 1 to 10 do
begin
PostMessage(fHandle,WM_TEST,0,i);
Sleep(500);
end;
PostMessage(fHandle,WM_TEST,1,0);
end;
А вот вызывающий модуль
procedure TForm1.OnMsg(var AMsg: TMessage);
begin
case AMsg.WParam of
0: ListBox1.Items.Add(IntToStr(AMsg.LParam));
1: Button1.Enabled := True;
end;
end;
var t : TThread = nil;
procedure TForm1.Button1Click(Sender: TObject);
begin
if t = nil then TBearPigletThread.CreateIt(Handle) else t.Resume;
Button1.Enabled := False;
end;
Тын-Дын (2009-02-22 00:57:00) [60]
> Медвежонок Пятачок © (22.02.09 00:51) [31]
> Давай конкретнее? Не будем просто так языком чесать?Давай.
> Уточним, в чем суть спора.создать один экземпляр нитки и
> иметь возможность запустить ее много раз повторно без пересоздания,
> но только тогда, кода она закончила всю прикладную работу
> с предыдущего вызова?Верно? Я ничего не упустил?
Верно.