Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2009, 13:55   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Немедленная остановка потока.

Привет всем!
У меня такой вопрос: Как мне немедленно завершить поток?
Вот у меня, скажем, есть поток (myThread: tMyThread);
Допустим в процедуре потока (execute) выполняется код с несколькими sleep-ами. Как мне немедленно прервать выполнение такого потока?
Что-бы вы мне не писали о terminate, скажу, что в потоке вызываться функция, скажем из DLL, которая должна что-то там сделать и которая выполняется определённое время. Как мне прервать выполнение потока?
Если делаю так: myThread.destroy или suspend, то поток ждёт, пока вызванная процедура завершиться и только после этого уничтожаеться...
Altera вне форума Ответить с цитированием
Старый 03.02.2009, 14:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

задачу раскрой подробнее, по любому есть другие пути решения.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2009, 15:37   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

TerminateThread прибивает поток немедленно, но мешать API с TThread не рекомендуется, т.к. там свои механизмы синхронизации и управления потоками, опять же:

Цитата:
TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination.
а фиг его знает что там творит TThread в конкретный момент времени, и что случится с остальными потоками при принудительном завершении одного
пыщь
JTG вне форума Ответить с цитированием
Старый 03.02.2009, 21:45   #4
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
в потоке вызываться функция, скажем из DLL, которая должна что-то там сделать и которая выполняется определённое время.
А эта функция лично тобой написана или из сторонней библиотеки?
Jeni вне форума Ответить с цитированием
Старый 04.02.2009, 13:02   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
А эта функция лично тобой написана или из сторонней библиотеки?
Не важно, главное, там ничё такого нет....
Altera вне форума Ответить с цитированием
Старый 04.02.2009, 14:31   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

1. В execute и всех методах, вызываемых из него, должна быть конструкция типа
Код:
If not terminated then 
begin
  //работаем
end;
2. Любые манипуляции из потока с компонентами выносятся в отдельный метод, допустим DoUpdateForm, который вызывается в пределах execute: Synchronize(DoUpdateForm);

3. Принудительно завершить поток можно в любой момент, вызвав TerminateThread(myThread.Handle, 0);, но это плохой способ + нет гарантии, что последующий myThread.Free; отдаст обратно все ресурсы.
пыщь
JTG вне форума Ответить с цитированием
Старый 05.02.2009, 04:45   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
3. Принудительно завершить поток можно в любой момент, вызвав TerminateThread(myThread.Handle, 0);, но это плохой способ + нет гарантии, что последующий myThread.Free; отдаст обратно все ресурсы.
А при обычном завершении (после выполнения) потока он сам отдаёт ресурсы, или мне надо самому вызывать метод free последней строчкой в execute?
Altera вне форума Ответить с цитированием
Старый 05.02.2009, 15:19   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Отдаст сам, если установить свойство FreeOnTerminate:=true;
А в потоке пытатся, пардон, отFree`ть самого себя естественно нельзя =)
пыщь
JTG вне форума Ответить с цитированием
Старый 05.02.2009, 16:33   #9
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

А перезапустить поток можно, после того, как он завершиться? Или надо новый создавать?
Altera вне форума Ответить с цитированием
Старый 05.02.2009, 16:39   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Нет нельзя. Вы видать не понимаите что такое поток... ну представьте себе такую схему

ВХОД В ПОТОК


ВЫХОД ИЗ ПОТОКА


Все... между входом и выходом должно быть

Код:
while not Terminated do ;
Разумеется, если там не сильная нагрузка то делать надо паузы ( Sleep ). И чем к примеру нельзя сделать две переменные типа паузы и выполнено. Т.е. ставите например выполнено = нет, и тогда в цикле срабатывает, что если не выполнено то делаите что хотите и ставите выполнено = да, а если пауза то просто игнорировать выполнено и вызывать Sleep, а если не пауза и выполнено то тоже Sleep. Вот вам и система отдельного потока.

Все на самом деле, приметивно и удобно, не надо закручивать с динамическими созданиями нескольких потоков..

p.s. сначла своей практики с потоками, сам так думал, что надо делать каждый раз новый поток, но знания приходят со временем
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остановка Memo Sanek777 Общие вопросы Delphi 1 11.09.2008 15:50
Ricoh Aficio FX200, замятие(остановка печати) PDVich Компьютерное железо 0 07.05.2008 10:22
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45
Остановка ADODS при OnFetchProcess QuAlex БД в Delphi 0 04.10.2007 17:31