TThread

Тема в разделе "Delphi - Система", создана пользователем mikle, 1 сен 2004.

Статус темы:
Закрыта.
  1. mikle

    mikle Гость

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

    Barmutik Гость

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

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

    mikle Гость

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

    Yason Гость

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

    mikle Гость

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

    zubr Гость

    Yason

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

    mikle

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

    Yason Гость

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

Поделиться этой страницей