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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2013, 08:41   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Геморрой с потоками

Вобщем геморрой с потоками, в одном потоке при
Код:
TThread1.Terminate;
поток останавливается, а в другом потоке почему то нет...

Делаю так:
Код:
procedure TThread1.Execute;
if not Terminated then
//код
end;
На кнопку "Старт" кидаю:
Код:
procedure TForm1.sButton1Click(Sender: TObject);
begin
potok.TThread1:=TThread1.Create(True);
potok.TThread1.Priority:=tplower;

potok.TThread1.FreeOnTerminate:=False; // если ставлю в True то TThread1.Terminate; не срабатывает, но с Suspend почему-то
                                       //срабатывает (всегда делал через Suspend вместо Terminate если требовалось остановить поток...

potok.TThread1.Resume;
end;
На кнопку "Стоп" кидаю:
Код:
potok.TThread1.Terminate;
Всегда делал через Suspend и проблем кроме "Неверный дескриптор" небыло, но сейчас уже решил сделать по нормальному, но не получается. В чем причина того что на первом потоке Terminate срабатывает а на втором потоке нет, причем код кнопок "Старт" и "Стоп" и там и там одинаковый? Спасибо.

Последний раз редактировалось FleXik; 06.07.2013 в 08:45.
FleXik вне форума Ответить с цитированием
Старый 06.07.2013, 09:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TThread1.Execute;
if not Terminated then
//код
end;
Ну и что? Такой код только однажды проверит значение Terminated и если False, то поток будет работать сутками. Обычно для этого цикл в потоке и проверка внутри цикла
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.07.2013, 09:25   #3
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Код:
procedure TThread1.Execute;
while not Terminated do
//код
end;

///
procedure TForm1.sButton1Click(Sender: TObject);
begin
potok.TThread1:=TThread1.Create(True);
potok.TThread1.Priority:=tpnormal;

potok.TThread1.FreeOnTerminate:=true; // если ставлю в True то TThread1.Terminate; не срабатывает, но с Suspend почему-то
                                       //срабатывает (всегда делал через Suspend вместо Terminate если требовалось остановить поток...

potok.TThread1.Resume;
end;
Кольша вне форума Ответить с цитированием
Старый 06.07.2013, 09:26   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Код:
procedure TMyThread.Execute;
begin
   while True do
     if MyThread.Teminated then break;
end;
так?
FleXik вне форума Ответить с цитированием
Старый 06.07.2013, 09:29   #5
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

выше код посмотри.
Кольша вне форума Ответить с цитированием
Старый 06.07.2013, 09:32   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от Кольша Посмотреть сообщение
Код:
while not Terminated do
при while код будет выполняться до тех пор пока не нажать кнопку "Стоп", т.е даже если дойдет до конца кода, всеровно код будет выполняться заново и заново пока человек не нажмет кнопку "Стоп".
при if код будет выполняться только 1 раз (до конца кода).

может и тупо обьяснил, но думаю понятно.

Последний раз редактировалось FleXik; 06.07.2013 в 09:34.
FleXik вне форума Ответить с цитированием
Старый 06.07.2013, 09:36   #7
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Эм..сранные вы умники, новички..твой код:
Код:
procedure TMyThread.Execute;
begin
   while True do//пока правда, а она всегда выполняем код
     if MyThread.Teminated then break;//если мой поток крякнул стоп
end;
Мой код:
Код:
procedure TThread1.Execute;
begin
while not Terminated do//если мой поток НЕ крякнул выполняем код
//код
end;
Умник.
Кольша вне форума Ответить с цитированием
Старый 06.07.2013, 09:44   #8
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

UPD:А еще хотелось бы узнать, что ты хочешь от потока, и весь код, где описаны(если описаны) конструкторы и деструкторы.
Кольша вне форума Ответить с цитированием
Старый 06.07.2013, 09:45   #9
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Мой код:
Код:
procedure TThread1.Execute;
begin
while not Terminated do//если мой поток НЕ крякнул выполняем код
//код
end;
Умник.
омг, если я написал что при while not Terminated do - код будет выполняться хоть 1 000 000 раз и не завершится пока ты САМ не нажмешь кнопку "Стоп" значит так оно и есть? я не хочу тут спорить, но если я знаю это и делал так не раз, и даже при while not Terminated do кнопка "Стоп" не пашет, удали Delphi пожалуйста.
FleXik вне форума Ответить с цитированием
Старый 06.07.2013, 09:47   #10
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

5 минут, умный ты человек подожди, никуда не уходи плиз.
Кольша вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками. Aleksandr Общие вопросы Delphi 9 12.03.2013 20:56
Управление потоками vandrouny Win Api 12 04.01.2011 03:52
Ошибка с потоками C# MyXa Общие вопросы .NET 3 25.08.2010 16:54
работа с потоками session Общие вопросы C/C++ 6 21.06.2010 17:13
Проблемы с потоками в С m9yt Общие вопросы C/C++ 4 14.04.2010 14:25