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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2011, 21:22   #1
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
Лампочка как запустить поток второй раз

создаю так поток
Код:
pott:= regfreell.Create(True);
pott.FreeOnTerminate:=false;
вызываю так
Код:
pott.Resume;
при первом вызове поток нормально запускается и работает
потом поток останавливаю командой
Код:
pott.Terminate;
в коде потока свойства Terminated проверяется примерно так
Код:
if Terminated then exit;
свойство Terminated становиться истиным процедура Execute потока завершается.
когда я снова запускаю поток, вызываю метод
Код:
pott.Resume;
то поток не запускается.
Скажите пожалуйста в чем дело?
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Старый 02.10.2011, 21:29   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
потом поток останавливаю командой
попробуй остановить pott.suspend;
и потом запустить
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.10.2011, 21:33   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

может потому что поток не освобождается? Ведь у вас:
FreeOnTerminate:=false
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 21:37   #4
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

да, не освобождаеться, но я его и создаю только один раз при запуске программы, но можно каждый раз создавать поток перед запуском тогда FreeOnTerminate:=true сделать. я просто хотел понять почему не работает именно так
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Старый 02.10.2011, 21:42   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

повторяю попробуй остановить pott.suspend;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.10.2011, 21:46   #6
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

pott.suspend приостанавливает поток, но не завершает. но я не пробывал
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Старый 02.10.2011, 21:50   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

во, вот вам и ответ на Ваш вопрос "как запустить поток второй раз".
Приостановили - Запустили - не нужен поток - удалили, как Вы указали выше
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.10.2011, 21:59   #8
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

а я думал можно полностью остановить поток чтоб завершилась процедура Execute, не удаляя его, и потом запустить, не создавая заново
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Старый 02.10.2011, 22:36   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

TThead.Terminate - не завершает работу потока, а всеголишь ставить Tthread.terminated:=True

А вам в потоке нужно сделать If Terminated then Exit;
И если поток не вырубается, значит где-то есть цикл, в чьём теле не выполняется выше приведённая проверка, и метод отрабатывает своё, только после этого даёт потоку прибиться.

Либо поток вырубается, однако вы не знаете об этом. Если не знаете, то дайте событие OnTerminate, и там сообщите себе о том, что поток прибился.

Последний раз редактировалось Человек_Борща; 02.10.2011 в 22:40.
Человек_Борща вне форума Ответить с цитированием
Старый 02.10.2011, 22:47   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
то поток не запускается.
Скажите пожалуйста в чем дело?
Потому что Resume возобновляет работу Suspend.

А у вас поток уже нет вообще. Он уже "отстрелялся". Завершён он. Всё, нечему продолжать работу.

Что с этим делать - пересоздать поток. С учётом того, что поток у вас уже завершён - это копеечная работа (выделить десяток-другой байт).

А можно изначально не выходить из потока (поток не завершается). Пусть поток ждёт ваших команд.

Только работать с ним тогда надо не через Suspend/Resume.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить приложение несколько раз? Trip Помощь студентам 2 04.09.2011 18:28
Как запустить одно приложение много раз ? Jugger Операционные системы общие вопросы 2 08.03.2011 22:07
Как запустить форму только один раз artemavd Общие вопросы Delphi 9 28.11.2010 16:43
КАК в DELPHI сделать второй поток ( чтобы pop3 с прогой не вис) M@g soft Помощь студентам 0 11.05.2009 18:12
Как остановить поток а потом снова запустить? Des Общие вопросы Delphi 5 03.05.2009 12:35