![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread
RASkov © (2007-02-05 03:04:00)Как правильно стартануть завершившийся но не уничтоженный поток заново?
Leonid Troyanovsky (2007-02-06 21:56:00) [1]
> RASkov (06.02.07 21:26) [29]
> Спасибо. А что если что нибудь так сделать:
Не. Положение не настолько критическое (просто,
позволил себе поворчать).
Во-первых, есть простодушное, но железобетонное: TThread.Create..Free.
Во-вторых, есть возможность держать поток (пул потоков) в ожидании запросов.
Ну, а, в-третьих, организовать собс-ную оболочку для потока не так уж
и сложно, т.к. функция потока принимает параметр, который может
быть, например, указателем на экземпляр класса (потока).
См. также исходники TThread.
--
Regards, LVT.
RASkov (2007-02-06 21:26:00) [2]> [19] Сергей М. © (06.02.07 16:29)
> Кто "она" ?
[5]> Надо не поток стартовать, а необходимую процедуру в потоке, тогда не будет и таких извратов
Ну так она же не в потоке выполнится, т.е.
> //но что, все-таки, имелось ввиду в [5]....?
> Если вызвать процедуру потока, то она выполнится в основном потоке, а не в созданном(том в котором она описана)....
??
> [25] Leonid Troyanovsky © (06.02.07 18:04)
Спасибо. А что если что нибудь так сделать:
construktor TMyThread.MyCreate(S: Bool);
begin
inherited Create(S);
K:=T.Create; //к примеру
///
end;
procedure TMyThread.Start(S: Bool);
begin
if Work then Exit;
inherited Create(S);
end;
?
Leonid Troyanovsky (2007-02-06 18:24:00) [3]
> Leonid Troyanovsky © (06.02.07 18:12) [27]
> > поток убивать, а дельфи-объект держать, экономя на Destroy/Create,
Да и дело не только в экономии ресурсов.
Вот, например, TTimer. Мне нет никакого дела до того,
что при Enabled := False виндовый таймер уничтожается,
а при наоборот - создается.
Поток несколько более сложный объект чем таймер,
а из средств управления - породить и убить.
--
Regards, LVT.
Leonid Troyanovsky (2007-02-06 18:12:00) [4]
> evvcom © (06.02.07 16:44) [20]
> для него данные, пусть уснет. А только для того, чтобы а
> вдруг потребуется опять поток с таким же функционалом, ОС-
> поток убивать, а дельфи-объект держать, экономя на Destroy/Create,
> не вижу смысла. Имхо.
А зачем тогда TThread? Требуемой функциональности легко
достичь простым BeginThread, IMHO.
--
Regards, LVT.
Leonid Troyanovsky (2007-02-06 18:09:00) [5]
> Сергей М. © (06.02.07 16:48) [21]
> Только не в форме Thread.Create-конструктора, а в форме
> некоего потенциально возможного метода Thread.ReCreate с
Пусть так. Но, препятствием на этом пути является приватность
того же FTerminated. Т.е., налицо - плохое проектирование класса.
Казалось бы, управление виндовыми сущностями, скажем,
окнами, таймерами и др. - давно и успешно освоенная тема.
--
Regards, LVT.
Leonid Troyanovsky (2007-02-06 18:04:00) [6]
> RASkov (06.02.07 16:24) [18]
> второй
> T.Create(False);
Да.
--
Regards, LVT.
Leonid Troyanovsky (2007-02-06 18:03:00) [7]
> Сергей М. © (06.02.07 15:41) [16]
> Ну тогда речь у тебя должна была зайти, в 1-ю очередь, не
> про какие-то там FTerminated и FFinished, а про хендл (или
> ID) уже созданного треда как объекта ОС и его фигурировании
> в конструкторе треда как дельфийского объекта)
С хендлом больших проблем нет, т.е. он среди public.
А вот с приватными полями - есть, их-то надо обнулить
при повторном вызове. Хотя, конечно, собака рылась
именно в FTerminated - для правильно построенных поточных
функций именно она воспрепятствует работе потока.
--
Regards, LVT.
Сергей М. (2007-02-06 16:55:00) [8]
> evvcom © (06.02.07 16:52) [22]
> Тогда уж Initialize :)
Да обзови его хоть горшком - лишь бы смысл был прозрачен)
evvcom (2007-02-06 16:52:00) [9]> [21] Сергей М. © (06.02.07 16:48)
> Впрочем, некая доля разумного в идеях ЛТ есть.
Да я и не говорю, что разумного нет. Да, можно было сделать. Просто мне такого никогда не требовалось, может потому я и не вижу смысла. Потому я "ИМХО" и добавил.
> Thread.ReCreate
Тогда уж Initialize :)
Сергей М. (2007-02-06 16:48:00) [10]
> evvcom © (06.02.07 16:44) [20]
Впрочем, некая доля разумного в идеях ЛТ есть.
Только не в форме Thread.Create-конструктора, а в форме некоего потенциально возможного метода Thread.ReCreate с соответствующими принципиальными коррекциями в самом классе TThread.
evvcom (2007-02-06 16:44:00) [11]> [17] iXT © (06.02.07 16:18)
> Но зачем держать в памяти ничего не делаюший поток.
Поток или объект-обертку над ОС-потоком? ОС-поток и так умирает, а объект-обертка может потребоваться, чтобы получить какие-то результаты работы потока, и только потом этот объект может быть уничтожен. Так что не надо путать.
> [11] Leonid Troyanovsky © (06.02.07 12:49)
Я не вижу смысла в повторной инициализации TThread. Если он закончил работу, то пусть умрет, если временно закончились для него данные, пусть уснет. А только для того, чтобы а вдруг потребуется опять поток с таким же функционалом, ОС-поток убивать, а дельфи-объект держать, экономя на Destroy/Create, не вижу смысла. Имхо.
Сергей М. (2007-02-06 16:29:00) [12]
> Ну так она же не в потоке выполнится,
Кто "она" ?
RASkov (2007-02-06 16:24:00) [13]Спасибо всем ответившим.
Прочел все сообщения. Некоторые уточнения
> [8] Leonid Troyanovsky © (06.02.07 11:30)
> Формально должно было бы так: Thread.Create(..),
Т.е. так имелось ввиду
var T: Thread;
первый "старт"
T:=Thread.Create(False);
второй
T.Create(False);
??
> [9] Сергей М. © (06.02.07 11:34)
Ну так она же не в потоке выполнится, т.е. [7] вторая строка...
Извеняюсь, если ответы на эти уточнения уже озвучены сдесь, я их не увидел, сорри.
iXT (2007-02-06 16:18:00) [14]
> evvcom © (06.02.07 09:08) [6]
В принципе не причем. Но зачем держать в памяти ничего не делаюший поток. ИМХО поток нужен для выполнения "тяжелых" операций, дабы не загружать основной. Сделал свое "грязное дело" свободен, тобеж FREE. Пока нужен крутись в while. Понадобишся еще создадут заново.
Хотя конечно все от конкретной задачи зависит...
Сергей М. (2007-02-06 15:41:00) [15]
> Leonid Troyanovsky © (06.02.07 15:36) [15]
> Только про дельфийский.
Ну тогда речь у тебя должна была зайти, в 1-ю очередь, не про какие-то там FTerminated и FFinished, а про хендл (или ID) ужесозданного треда как объекта ОС и его фигурировании в конструкторе треда как дельфийского объекта)
Leonid Troyanovsky (2007-02-06 15:36:00) [16]
> Сергей М. © (06.02.07 15:16) [14]
> Причем здесь FTerminated и FFinished, если к работе thread-
> объекта как ОС-объекта они не имеют ни малейшего отношения
А я, вообще, ничего не говорил про ОС-объект.
Только про дельфийский.
--
Regards, LVT.
Сергей М. (2007-02-06 15:16:00) [17]
> Leonid Troyanovsky © (06.02.07 14:28) [13]
Что-то ты загнул)
Причем здесь FTerminated и FFinished, если к работе thread-объекта как ОС-объекта они не имеют ни малейшего отношения ?
Leonid Troyanovsky (2007-02-06 14:28:00) [18]
> Сергей М. © (06.02.07 13:57) [12]
> > борланды забыли про инициализацию в конструкторе
> > FTerminated, FFinished
> А какой еще явной инициализации требуют эти поля, если они
> по умолчанию и так уже равны False, что вполне логично
Не по умолчанию, а при создании. Т.е. это заслуга не
конструктора, а, скажем, InitInstance.
Но, при повторном вызове Create и не требуется оный вызов
(иначе, весь его смысл пропадает).
Согласен, что случай этот весьма специфический, но,
именно в этом случае логичен вызов Thread.Create
(как неклассовый вызов). Ну, и с этим случаем борланды
не справились, хотя вполне были и в состоянии.
Например, достаточно было обратить переменные
состояния (на not), т.е., немного подумать
при проектировании этого класса.
--
Regards, LVT.
Сергей М. (2007-02-06 13:57:00) [19]
> борланды забыли про инициализацию в конструкторе
> FTerminated, FFinished
А какой еще явнойинициализации требуют эти поля, если они по умолчанию и так уже равны False, что вполне логично ?
Leonid Troyanovsky (2007-02-06 12:49:00) [20]
> evvcom © (06.02.07 11:57) [10]
> > борланды забыли про инициализацию в конструкторе
> > FTerminated, FFinished и т.д.
> А зачем их инициализировать в конструкторе? Любой объект
> создаваясь инициализирует все свои поля в 0, для буль это
> и будет False. Все логично.
Всякий конструктор должен уметь работать в двух режимах:
когда объект создается, и когда он иницилизируется (повторно),
или, скажем, вызывается как inherited Create.
Ну, а правильное место для правильной инициализации -
конструктор. По-моему, логично.
> Зачем? Чтобы дать волю шаловливым ручкам? ИМХО, не стоит.
Чтобы можно было выправить чьи-то кривые ручки.
Хм. Особенно умиляет первый вызов inherited Create
(т.е., видимо, чтобы все было как положено).
--
Regards, LVT.