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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2015, 18:33   #1
cometa
Пользователь
 
Регистрация: 19.09.2015
Сообщений: 10
Сообщение Потоки (Threads) не останавливаются

Всем привет,пишу не большую программку с использованием многопоточности все прекрасно работает,но потоки не останавливаются в конце,либо не понятно что делается...
вот код
Код:

procedure TMyThread.Execute;
var
  HTTP: THttpSend;
  HTML:Tstringlist;
begin

   while not terminated do begin
   CS.Enter;
   inc(acc);
     if Acc<Accounts.Count then CurAcc:=Acc else Work:=False;
     inc(np);
 if np>Proxys.Count then  np:=0;
  CS.Leave;
   if work then begin
    


   
  synchronize(sync);
   end;

   end;

   terminate;
  if Thread=0 then  Showmessage('The End!');

end;
Подскажите в чем проблема ?

Последний раз редактировалось cometa; 19.09.2015 в 18:42.
cometa вне форума Ответить с цитированием
Старый 19.09.2015, 18:36   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Бруты, чеккеры и прочее подобное дерьмо запрещено! До свидания!
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 19.09.2015, 18:39   #3
cometa
Пользователь
 
Регистрация: 19.09.2015
Сообщений: 10
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Бруты, чеккеры и прочее подобное дерьмо запрещено! До свидания!
А если я уберу код и поставлю цикл который будет выводить в мемо текст?
Просто кинул сюда такой код а разница в чем ?

Последний раз редактировалось cometa; 20.09.2015 в 10:55.
cometa вне форума Ответить с цитированием
Старый 19.09.2015, 19:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
потоки не останавливаются
Это потому что у тебя не прописана остановка потока
Где гарантии что твоя программа при завершении (как я понимаю речь идет о завершении твоей проги) посылает сообщение потоку тормознуться?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.09.2015, 21:18   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от cometa Посмотреть сообщение
А если я уберу код и поставлю цикл который будет выводить в мемо тескт?
Просто кинул сюда такой код а разница в чем ?
Да по коду как раз понятно это, звездочет! Читать надо уметь код, а не копировать.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 20.09.2015, 10:57   #6
cometa
Пользователь
 
Регистрация: 19.09.2015
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это потому что у тебя не прописана остановка потока
Где гарантии что твоя программа при завершении (как я понимаю речь идет о завершении твоей проги) посылает сообщение потоку тормознуться?

Код:
Procedure potok.execute;
while not terminated do
begin
if not terminated do
begin
//тут выполняемый код

end;
end;
terminate; //убываем поток
end;
но после этого программа продолжает работать
Если я что-то делаю не так то простите заранее

Последний раз редактировалось Stilet; 20.09.2015 в 11:13.
cometa вне форума Ответить с цитированием
Старый 20.09.2015, 11:16   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
terminate; //убываем поток
Это не убийство потока. Поток освобождается после того, как завершает работу его метод Execute, если FreeOnTerminate стоит в True и просто останавливается в другом случае. Сам метод Terminate служит всего лишь для установки свойства-флага, которое рекомендуется для проверки стоп-сигнала:
Код:
procedure TThread.Terminate;
begin
  FTerminated := True;
end;
Это из генофонда.
Поэтому тебе вызывать метод terminate нужно извне потока. И после вызова методом WaitFor() подождать пока поток остановится. И только тогда завершать работу самой формы или приложения главного или что там у тебя завершается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.09.2015, 11:20   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
terminate
Так из вызывающей проги можно потоку подать сигнал, что завершай свое черное дело. Тогда terminated станет True и цикл в execute завершится и поток тоже, если после нет ни каких препятствий. А твои потуги использовать terminate не в дугу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.09.2015, 13:16   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Комета, давай поясню подробно, ибо по выражению гнлаз вижу что ты не понимаешь о чём идёт речь

Код:
procedure TMyThread.Execute;
var
  HTTP: THttpSend;
  HTML:Tstringlist;
begin
 =============НАЧАЛО ЦИКЛА ===========
  while not terminated do
   begin 
     CS.Enter;
     inc(acc);

     if Acc<Accounts.Count then      
         CurAcc:=Acc 
     else 
        Work:=False;
     inc(np);

    if np>Proxys.Count then  np:=0;

    CS.Leave;
    if work then 
    begin
 
       synchronize(sync);
    end;
  end;
 =============КОНЕЦ ЦИКЛА ===========

   // МЫ ОКАЖЕМСЯ ТУТ, ЕСЛИ ЦИКЛ КТО_ТО ПРЕРВЁТ И terminated СТАНЕТ = FALSE




   terminate; << ВОПРОС, КАК ТЫ ДОЙДЁШЬ СЮДА, ЕСЛИ ТЫ ВИСИШЬ В ЦЫКЛЕ (СИНИМ ВЫДЕЛЕНО НАЧАЛО/КОНЕЦ)
   if Thread=0 then  Showmessage('The End!');
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 20.09.2015, 14:40   #10
cometa
Пользователь
 
Регистрация: 19.09.2015
Сообщений: 10
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Комета, давай поясню подробно, ибо по выражению гнлаз вижу что ты не понимаешь о чём идёт речь

Код:
procedure TMyThread.Execute;
var
  HTTP: THttpSend;
  HTML:Tstringlist;
begin
 =============НАЧАЛО ЦИКЛА ===========
  while not terminated do
   begin 
     CS.Enter;
     inc(acc);

     if Acc<Accounts.Count then      
         CurAcc:=Acc 
     else 
        Work:=False;
     inc(np);

    if np>Proxys.Count then  np:=0;

    CS.Leave;
    if work then 
    begin
 
       synchronize(sync);
    end;
  end;
 =============КОНЕЦ ЦИКЛА ===========

   // МЫ ОКАЖЕМСЯ ТУТ, ЕСЛИ ЦИКЛ КТО_ТО ПРЕРВЁТ И terminated СТАНЕТ = FALSE




   terminate; << ВОПРОС, КАК ТЫ ДОЙДЁШЬ СЮДА, ЕСЛИ ТЫ ВИСИШЬ В ЦЫКЛЕ (СИНИМ ВЫДЕЛЕНО НАЧАЛО/КОНЕЦ)
   if Thread=0 then  Showmessage('The End!');
end;
ну это можно сделать например
Код:
break;
- ом
cometa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив threads(Qt) Satansoft Помощь студентам 2 27.11.2014 22:15
threads Satansoft Общие вопросы C/C++ 0 22.11.2014 22:23
Threads Merzaffka C/C++ Сетевое программирование 0 29.03.2011 17:31
Threads ImmortalAlexSan Помощь студентам 0 20.05.2010 18:29
Службы останавливаются сами по себе Ronni10 Операционные системы общие вопросы 3 01.10.2009 17:20