![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| zalex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.5.2005 Репутация: 2 Всего: 2 |
Есть поток, его необходимо уничтожить, но по-человечески, а именно - что бы в момент убивания у него сработало какое нить событие. Как уничтожить и как описать событие?
Перепробовал много. Начал с того, что присвоил ONTerminate:=MyProcedure; Но - если убивать поток Potok.Free, то событие не срабатывает. Если при убийстве писать Potok.Terminate, то он не уничтожается, а прорабатывает до конца. TerminateThread(Potok.Handle, 0); тожде не помогает - поток убивается, но события не возникает. suspend вообще просто приостанавливает, а Potok.suspend; Potok.Terminate не приводит к возникновению события Как быть? Понимаю, что всё наверняка проще простого, но уже запутался. |
|||
|
||||
| andrey_pst |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 37 Регистрация: 24.4.2003 Где: Пермь Репутация: 1 Всего: 1 |
Не убивает поток, а устанавливает его свойство Terminate в true или false. При этом завершением работы потока нужно заниматься самому, например, проверяя значение свойства Terminate в методе TPotok.Execute:
|
|||
|
||||
| Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 4 Всего: 28 |
Делаю так, при создании ставлю свойство FreeOnTerminate:=True.
А в Destroy делаю что надо.
-------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
| zalex |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.5.2005 Репутация: 2 Всего: 2 |
Угу. Разобрался, и для решения задачи, породившей этот вопрос вполне ответа хватает. Но если посмотреть глубже, если нет возможности проверить свойство Terminate, то как быть, нпример
|
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Тогда убей жестоко:
|
|||
|
||||
| zalex |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.5.2005 Репутация: 2 Всего: 2 |
так тогда OnTerminate не срабатывает Я хочу еще раз уточнить, чего хочу 1.Что бы поток убился 2. Что бы при таком убитии возникло у него какое либо событие. Например вызов Free не помогает, т.е. получается иногда ситуация, что Destroy вызывается два раза. Добавлено @ 18:29
Что обозначают таймауты в данном посте не понял, но понял мысль. Сам её рассматривал, но как вспомогательный вариант. НЕужели нет ничего попроще, и не обходного, ведь куча других объектов удаляются без проблем, что в потоке такого особенного? |
||||||
|
|||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
||||
|
||||
| zalex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.5.2005 Репутация: 2 Всего: 2 |
А TerminateThread ессно никакими деструкторами не пользуется?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Он вообще ничем не пользуется - просто делает свою работу.
Это функция WinAPI и не имеет отношения к дельфевым объектам. Дельфийские способы уничтожения не уничтожают тред, а всего лишь выставляют флаг. Если нужны решительные действия, то они не помогут. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Добавлено @ 22:02 Либо написать свой поточный класс, что тоже не есть сложно... -------------------- |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Таймауты необходимы для процедур , которые могут не ответить , и ждать своего внутреннего события, по таймауту , такая ф-ция сбрасывается и отдает управление твоему потоку. Как правило пользуются асинхроным вводом/выводом в таких случаях. Ксати ты так и не сказал , что за ф-ция внутри потока , которая может не ответить? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| zalex |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.5.2005 Репутация: 2 Всего: 2 |
Мысль с таймаутами я понял, как и написал ранее
repeat //очередной раз проверяю ринг if Terminate then break; until False; Да, пожалй по теме вопросов не осталось, всем спасибо. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |