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-ый поток исполняться?


Медвежонок Пятачок   (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]
> Давай конкретнее? Не будем просто так языком чесать?Давай.
> Уточним, в чем суть спора.создать один экземпляр нитки и
> иметь возможность запустить ее много раз повторно без пересоздания,
>  но только тогда, кода она закончила всю прикладную работу
> с предыдущего вызова?Верно? Я ничего не упустил?


Верно.


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

Наверх

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