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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2010, 17:02   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
Вопрос Ограничение времени выполнения кода

Возможно ли ограничить время выполнения определенного куска кода программы? И если код не уложился в установленное время совершаем определенное действие.
Crystallon вне форума Ответить с цитированием
Старый 16.05.2010, 18:03   #2
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

var
TimeT: integer;
begin
TimeT := GetTickCount;
{Ваш код}
if GetTickCount - TimeT > 5000 then
ShowMessage('Код выполнялся больше 5 сек');
end;
W0LF вне форума Ответить с цитированием
Старый 16.05.2010, 22:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

W0LF, я думаю, что автору топика чуть другого хочется - если код выполняется дольше заданного - запустить процедуру ВО ВРЕМЯ выполнения "медленной" процедуры...

думаю, что надо копать в сторону.
1) критичный код запустить в отдельном потоке (это на случай, если его надо прервать. Если же прерывание кода "медленной процедуры" не планируется, можно и в основном потоке оставить...
2) повесить таймер с нужным временем. На нём "повесить" процедуру, которая должна выполниться, если тестируемый код "припозднился"...
3)
Код:
  timerCritical.Enable := true;
  <тут Ваш код>
  timerCritical.Enable := false;

Последний раз редактировалось Serge_Bliznykov; 16.05.2010 в 22:57.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.06.2010, 02:21   #4
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
W0LF, я думаю, что автору топика чуть другого хочется - если код выполняется дольше заданного - запустить процедуру ВО ВРЕМЯ выполнения "медленной" процедуры...

думаю, что надо копать в сторону.
1) критичный код запустить в отдельном потоке (это на случай, если его надо прервать. Если же прерывание кода "медленной процедуры" не планируется, можно и в основном потоке оставить...
2) повесить таймер с нужным временем. На нём "повесить" процедуру, которая должна выполниться, если тестируемый код "припозднился"...
3)
Код:
  timerCritical.Enable := true;
  <тут Ваш код>
  timerCritical.Enable := false;
Прерывание кода "медленной процедуры" не планируется, но вот как это сделать:
Цитата:
повесить таймер с нужным временем. На нём "повесить" процедуру, которая должна выполниться, если тестируемый код "припозднился
Crystallon вне форума Ответить с цитированием
Старый 16.06.2010, 10:07   #5
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

А пусть лучше этот код сам себя прерывает, а? Что это за код? Там цикл есть? Пусть он при каждой итерации проверяет наш GetTickCount и в случае чего - Break, Exit или в крайнем случае - GoTo

Да и вообще, если мы его выполнение таймером прервём, потом к этому коду всё равно управление вернётся, так что он по-любому должен сам себя прерывать.
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 16.06.2010, 12:37   #6
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от Олвин Посмотреть сообщение
А пусть лучше этот код сам себя прерывает, а? Что это за код? Там цикл есть? Пусть он при каждой итерации проверяет наш GetTickCount и в случае чего - Break, Exit или в крайнем случае - GoTo

Да и вообще, если мы его выполнение таймером прервём, потом к этому коду всё равно управление вернётся, так что он по-любому должен сам себя прерывать.
Цикла нету...
Crystallon вне форума Ответить с цитированием
Старый 16.06.2010, 15:13   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Цикла нету...
а что же там есть, что требует контроля времени?

линейный поток вычислений (это же сколько строк кода надо чтобы долго вычислялось).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 16.06.2010, 16:20   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

На скорую руку. Предполагается, что вместо бесконечного цика какой-то подвисший процесс.

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, Classes, StdCtrls, SysUtils;

type
  TThreadController = class(TThread)
  private
    fThread: TThread;
    fTimeout: cardinal;
  public
    constructor Create(thread: TThread; timeout: cardinal);
    procedure Execute; override;
  end;

  TMyThread = class(TThread)
  public
    procedure Execute; override;
  end;

  TMyThread2 = class(TThread)
  public
    procedure Execute; override;
  end;

constructor TThreadController.Create(thread: TThread; timeout: cardinal);
begin 
  fTimeout := timeout;
  fThread := thread;
  FreeOnTerminate := true;

  inherited Create(false);
end;

procedure TThreadController.Execute;
begin
  if WaitForSingleObject(fThread.handle, fTimeout)<>WAIT_OBJECT_0 then 
  begin  
    TerminateThread(fThread.handle,0); //это плохо
    Writeln('killed (timeout)');
  end;
end;

procedure TMyThread.Execute;
begin
  repeat
    writeln('I''m thread #1 with timeout 5 sec. And i''m stuck in infinite loop :(');
    sleep(1000);
  until false;
end;

procedure TMyThread2.Execute;
begin
  writeln('Hi! I''m thread #2. My timeout is 10 sec ');
  sleep(7000);
  writeln('Hi again! I''m thread #2. I''m done in 7 sec :)');
end;

var msg: TMsg;

begin
  TThreadController.Create(TMyThread.Create(false), 5000); 
  TThreadController.Create(TMyThread2.Create(false), 10000); 
  while (GetMessage(Msg,0,0,0)) do DispatchMessage(Msg);
end.
пыщь

Последний раз редактировалось JTG; 16.06.2010 в 16:22.
JTG вне форума Ответить с цитированием
Старый 16.06.2010, 16:24   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Я бы тоже на сторожевой таймер повесил .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 16.06.2010, 19:52   #10
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Суть в том что описанный выше код весь на потоках, а с многопоточностью я не в ладах) у меня все идет в основном потоке и через заднее место, но суть в том что в моем случае больше 1го потока и не требуется.
Я сделал так:
Код:
Timer1.Interval:=15000;
reply:=idHTTP1.Post(Link,PostData); //Код, время выполнения которого нужно ограничить
Timer1.Interval:=0;
Код:
procedure TForm1.timerendClick(Sender: TObject);
begin
Timer1.Interval:=0;
exit;
Debag_content.Caption:='Превышен интервал ожидания запроса!';
if CheckBox1.Checked=false then
begin
ListBox7.ItemIndex:=ListBox7.ItemIndex+1;
end
else
begin
ListBox2.ItemIndex:=ListBox2.ItemIndex+1;
end;
Load.Click;
end;
Код:
В событие он таймер поместил timerendClick.
Поставьте на путь истинный, объясните почему это не работает. :D
Заранее благодарен.

Последний раз редактировалось Crystallon; 16.06.2010 в 19:56.
Crystallon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение компьютера по времени использования snakesoftware Безопасность, Шифрование 3 03.05.2010 14:44
Распределения работы по рабочим, по времени выполнения. Rhamzes Microsoft Office Excel 3 01.07.2009 15:04
Измерение времени выполнения цикла Alexcomeback Общие вопросы C/C++ 10 25.04.2009 16:58
ограничение по времени bunner Помощь студентам 4 05.02.2009 21:31
оптимизация для меньшения времени выполнения Ganmaker Паскаль, Turbo Pascal, PascalABC.NET 3 19.11.2008 17:33