![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
mikleN |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2004 Репутация: нет Всего: нет |
Уважаемый ALL, Если кто из вас имеет опыт работы с TThread подскажите, please, способ, чтобы быстро тушить триаду. Ситуация такая - есть поток данных в реальном времени, их надо обрабатывать. Чтобы не прерывался прием новых данных, обработка происходит в новой триаде. Обработка довольно длительная. Логика принята такая - если предыдущая триада завершилась,то создаем новую и все нормально. Если предудущая не завершена, то делаем Thread.Terminate, после чего создаем новую Thread.Create. Так вот иногда предыдущая не исчезает быстро и даже некотрое время они работают вместе и программа дохнет. Так вот вопрос существует ли способ быстрого тушения, только очищая стек, т.е. не применяя форсированную winAPI функцию, котороая не освобождает стек.
Применение методла .waifor не очень желательно, так как это замедляет, к тому же я не понял куда его надо вставлять. Либо может создавать пару триад для поочередной работы. Вот если есть у кого какие соображения - поделитесь пожалуйста. Спасибо. |
|||
|
||||
Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
Метод Terminate — это указание потоку завершиться, с возможностью корректно освободить ресурсы!
Путей здесь много, к примеру: 1)Добавляй глобальный флаг и при выходе из Execute меняй его, а в новом потока проверяй. 2)Прежде чем создать новый поток проверяй:
Для немедленного завершения потока, можеш использовать TerminateThread - но енто опасная штука ![]() Это сообщение отредактировал(а) Girder - 1.9.2004, 15:49 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
mikleN |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 28.4.2004 Репутация: нет Всего: нет |
Это я делаю.
не понял я как работает .WaitFor чего он ждет. такой код .Terminate; .waiFor; .Create(); почему то не работет у меня.
Т.е. логика такая если триада выполнена то будет выполняться Except, если же продолжается то будеt try стоять. А он что сам будет стоять , там тормоза никакого не надо? Спасибо. Это сообщение отредактировал(а) mikleN - 1.9.2004, 16:22 |
||||||
|
|||||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 15 Всего: 98 |
для "быстрого тшения" имеет смысл использовать самописный "мэнэджер потоков" который выделяет память под все переменные, используемые в потоках. Соответственно при вызове TerminateThread() память потеряна не будет
P.S. Terminate() просто устанвливает флаг Terminated а ответственность за остановку берет на себя поток ( поэтом если ты редко проверяеш этот флаг возможно большое время выхода ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Girder |
|
||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
_hunter согласен.
Пример использования: Т1:TMyThread - некий твой переопределенный класс
Удачи. Это сообщение отредактировал(а) Girder - 1.9.2004, 17:52 -------------------- Как слышим, так и пишим. Истина где-то там... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |