TThread

  • Автор темы mikle
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

mikle

Уважаемый ALL, Если кто из вас имеет опыт работы с TThread подскажите, please, способ, чтобы быстро тушить триаду. Ситуация такая - есть поток данных в реальном времени, их надо обрабатывать. Чтобы не прерывался прием новых данных, обработка происходит в новой триаде. Обработка довольно длительная. Логика принята такая - если предыдущая триада завершилась,то создаем новую и все нормально. Если предудущая не завершена, то делаем Thread.Terminate, после чего создаем новую Thread.Create. Так вот иногда предыдущая не исчезает быстро и даже некотрое время они работают вместе и программа дохнет. Так вот вопрос существует ли способ быстрого тушения, только очищая стек, т.е. не применяя форсированную winAPI функцию, котороая не освобождает стек.
Применение методла .waifor не очень желательно, так как это замедляет, к тому же я не понял куда его надо вставлять.
Либо может создавать пару триад для поочередной работы.
Вот если есть у кого какие соображения - поделитесь пожалуйста.
Спасибо.
 
B

Barmutik

Если мне не изменяет память то есть только два варианта:
1. Нормальный выход через if Terminted then Exit;
2. Через TerminateThread.

Если не хочеш срубать поток то просто почаще проверяй что поток должен быть закончен и выходи в случае необходимости.
 
M

mikle

Если не хочеш срубать поток то просто почаще проверяй что поток должен быть закончен и выходи в случае необходимости.
Да, похоже только так и можно. Я почему то думал, что Windows на себя берет прерывание работы потока и освбождение всего. Т.е. думал что Terminate что делает серьезное, а не только устанавливает terminated в true.
Спасибо.
 
Y

Yason

Я убедился на собственном опыте, что создавать поток каждый раз, когда он понадобится, а потом прибивать - не лучшая идея. Не оберёшься глюков: есть поток или нет, обрабатывает твой код, или внутренние процедуры API и т.д. и т.п. Благодатнейшая почва для EAccessViolation.
ИМХО, лучше все время держать один поток работающим. Если есть данные для обработки - пусть обрабатывает, если нет - Sleep(сколько_не_жалко). При этом, ессно, регулярно проверять флаг Terminated. Проблем становится меньше - не надо постоянно создавать/уничтожать поток, проверять его существование. Один раз создал (при запуске проги), один раз уничтожил(при закрытии проги).
 
M

mikle

Спасибо. Я понял. К сожалению, вынуждено это. Нужны только последние текущие данные.
Спасибо.
 
Z

zubr

Yason

Не всегда можно обойтись одним потоком.

mikle

В таких случаях, как у тебя, я обычно создаю потоки функцией API CreateThread, а для синхронизации между потоками использую WaitForSingliObject.
 
Y

Yason

zubr
это понятно, что не всегда. И более того - нечасто :) Пожалуй, я неточно расставил акценты: поток должен существовать всегда, а не создаваться/уничтожаться (если, конечно, иного не требует задача, пример - обработка клиентов сервером - количество клиентов меняется)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!