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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2011, 13:41   #1
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию Принудительный выход из процедуры

Доброго времени суток. У меня возникла проблема, которая заключается в том, что надо проверять проверять не остановилась ли процедура, и если она ничего не делает - прерывать ее.
Проблема в следующем.
У меня есть процедура, которая выполняется в цикле. Допустим это оправка POST запроса.

Код:
procedure PostData(STlist);
begin
 try
   idhttp1.Post('http://google.ru', STLIst); //Здесь иногда происходит зависание процедуры по непонятной причине. 
   Memo1.lines.add ('Оправлено.');
 except
 memo1.lines.add('Фигушки, ошибка однако!');
 end;
end;


procedure TMainForm.StopClick(Sender: TObject);
var i:integer;
     STL:TStringList;
begin
STL:=TStringList.create;
 For i:= 1 to 10 do
    PostData(STL);
end;
Сейчас иногда возникает такая ситуация, что процедура тупа виснет на отправке запроса и ничего дальше не делается, цикл не продолжается. Исходя из этого вопрос, как сделать так, чтобы допустим после минуты бездействия программа автоматически делала exit из данной процедуры.
Бездействие процедуры могу определять по тому, выводятся ли строки в отчет. То есть если минуту в отчете ничего не пишется - процедура остановилась. Необходимо из нее выйти. Как?
kardinal94 вне форума Ответить с цитированием
Старый 10.07.2011, 14:05   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

break - выход из цикла.
continue - переход к след. интерации цикла.
exit - выход из процедуры, функции...
Человек_Борща вне форума Ответить с цитированием
Старый 10.07.2011, 16:50   #3
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию

Это я знаю, только вопрос в том, как проверять? В таймере? Как из обработчика таймера завершить процедуру? Как из одной процедуры завершить другую?
kardinal94 вне форума Ответить с цитированием
Старый 10.07.2011, 17:27   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Пускать ваши процедуры в потоке. И проверять жив или мёрв поток.
А вообще выставить таймаут сединения у idHTTP
Человек_Борща вне форума Ответить с цитированием
Старый 10.07.2011, 19:37   #5
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Цитата:
Сообщение от kardinal94 Посмотреть сообщение
Как из одной процедуры завершить другую?
создать глобальную переменную
Код:
var
 StopProc : boolean = false;
и в цикле вставить проверку статуса StopProc
Код:
 if StopProc then 
   exit/break/continue;
и можно завершить поток из другой процедуры
ZuBy вне форума Ответить с цитированием
Старый 11.07.2011, 00:26   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вы в курсе, что каждое убийство потока - это минимум 1 Мб утечки? Добавляем к этому цикл - и ваша память исчерпается ОЧЕНЬ быстро.

Таймауты операций нужно правильно ставить.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.07.2011, 00:27   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.google.ru/search?q=idhttp+timeout
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.07.2011, 18:20   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Цитата:
Вы в курсе, что каждое убийство потока - это минимум 1 Мб утечки?
Не знал. Можно подробнее про физику сего смертоубийства?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 12.07.2011, 03:55   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Доки надо читать. Или Рихтера хотя-бы.

TerminateThread:

Цитата:
The target thread's initial stack is not freed, causing a resource leak.
Да даже если стек не утекал бы. Утечка ресурсов - это очевидно:

Код:
Buffer := AllocMem(BufSize);
try
  // что-то делаем
finally
  FreeMem(Buffer);
end;
Если уничтожить поток в середине его работы, все выделенные им ресурсы (в этом примере - Buffer) останутся висеть в программе вечно (утечка памяти).

P.S. Это, кстати, не единственная проблема. В редких случаях уничтожение потока может привести к вечной блокировке.

Вот пример (при рассмотрении мысленно замените suspend на terminate - будет то же самое).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 12.07.2011 в 03:57.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из процедуры mactepmac Общие вопросы Delphi 1 28.06.2011 06:56
Автозагрузка или принудительный запуск _-Re@l-_ Общие вопросы Delphi 19 15.01.2011 15:26
Word VBA как вставить разрыв принудительный в формулу ? bdfy Microsoft Office Word 13 01.12.2010 08:06
Не работает выход во внешнию среду из процедуры!!! Hacker19_90 Паскаль, Turbo Pascal, PascalABC.NET 1 10.11.2008 19:31