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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2010, 14:54   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию Ограничение времени выполнения функции

Программа загружает файл из интернета используя ниже показанную функцию, как ограничить время выполнения этой функции(чтобы в случае превышения этого времени остановить выполнение функции и совершить определенные действия)?
Заранее благодарю за помощь в решении этого вопроса.

Код:
function HTTPGetFile(const fileURL, FileName: string): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: file;
  sAppName: string;
begin
  Result := False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName),
  INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    if hURL <> nil then  begin
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen);
        FMain.Gauge1.Progress:=FMain.Gauge1.Progress+BufferLen;
        FMain.pr1.Width:=Trunc(progressX*FMain.Gauge1.Progress/FMain.Gauge1.MaxValue);
      until
        BufferLen = 0;
      CloseFile(f);
      Result := True;
    finally
      InternetCloseHandle(hURL);
    end;
  end;
  finally
    InternetCloseHandle(hSession);
  end;
    FMain.Gauge1.Progress:=0;
    FMain.pr1.Width:=0;
end;
Crystallon вне форума Ответить с цитированием
Старый 24.09.2010, 15:20   #2
kakawkin
Форумчанин
 
Регистрация: 21.09.2009
Сообщений: 431
По умолчанию

а что если в таймер пихануть Tag=1 и в тело:
if timer1.tag= then timer1.enable:=false ?????
kakawkin вне форума Ответить с цитированием
Старый 24.09.2010, 15:34   #3
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Конечно это первая мысль которая пришла мне в голову, перед выполнением функции запустить таймер, и на окончание таймера поставить нужный мне код, но я вспомнил что к примеру с idHTTP такое не прокатило, т.к. программа висела пока idHTTP не вернет управление, по этому решил это даже не пробовать.
Crystallon вне форума Ответить с цитированием
Старый 24.09.2010, 15:57   #4
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Код:
const
  MaxTickCount = ваше максимальное число;
...
Aborted: Boolean;
TickCount: Cardinal;
...
Rewrite(f,1);
Aborted := False;
TickCount := GetTickCount;
repeat
...
if (GetTickCount - TickCount) >= MaxTickCount then
begin
  Aborted := True;
  Break;
end; 
until
..
А потом если Aborted = True то выполняете ваши действия.
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 25.09.2010, 09:08   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Я, конечно, извиняюсь, но все нормальные люди пишут такие процедуры как загрузку файлов из интернета, загрузку больших файлов с диска, сложные и нудные мат опецации, (и другие "утомительные" процедуры) на исполнение в отдельном потоке... а в теле функции загрузки постоянно обновлять таймер, который по эвенту убивает поток (таймер обычно на 2-3 минуты ставлю)
написал бы пример, но сейчас дельфи нет под рукой...

алгоритм мне видится таким:
при старте потока создается и подключается idHTTP и создается остановленый таймер, передаются ему адрес ресурса и путь к файлу (и т.п.)
while not(idHTTP.connected) do sleep 20;
if idHTTP.connected then начать загрузку, запустить таймер
записать часть в файл, остановить и снова запустить таймер
по завершении загрузки таймер не останавливать.

по таймеру idHTTP.Free;Timer1.Free;TNewThread. Terminate;

Вот думаю, что как-то так... Но не уверен в работоспособности - писал "на коленках"
Код:
type
	TNewThread = class (TThread)
	protected
		Procedure Execute; override;
	public
		fileURL,FileName:string;
	private
		hSession, hURL: HInternet;
		Timer1:TTimer;
		f: file;
		Buffer: array[1..BufferSize] of Byte;
		BufferLen: DWORD;
		sAppName: string;
		procedure TimerEvent(Sender:TObject);
	end;
var
	NewThread:TNewThread;
const
	BufferSize = 1024;
...

Procedure TNewThread.Execute;
begin
	Timer1:=TTimer.Create(nil);
	Timer1.Interval:=120000; {2min)
	Timer1.Enabled:=false;
	Timer1.OnTimer:=TimerEvent;
	
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    if hURL <> nil then  begin
		try
			AssignFile(f, FileName);
			Rewrite(f,1);
			repeat
				InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
				BlockWrite(f, Buffer, BufferLen);
				Timer1.Enabled:=false;Timer1.Enabled:=true;
			until BufferLen = 0;
			CloseFile(f);
			Result := True;
		finally
			InternetCloseHandle(hURL);
		end;
	end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

procedure TNewThread.TimerEvent(Sender:TObject);
begin
	Timer1.Free;
	idHTTP.Free;
	NewThread.Terminate;
end;

procedire TMainForm.Button1Click(Sender:TObject);
begin
	NewThread:=TNewThread.Create(true);
	NewThread.FreeOnTerminate:=true;
	NewThread.Priority:=tpNormal;
	NewThread.OnTerminate:=NewThreadTerminate;
	NewThread.Adress:='нужный адрес файла в сети';
	NewThread.destfile:='c:\1.txt';
	NewThread.Resume;
end;
а прогресс через Synchronize сделать, думаю, не трудно...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось artemavd; 25.09.2010 в 10:06.
Johnson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение времени выполнения кода Crystallon Общие вопросы Delphi 10 16.06.2010 21:59
Замер времени выполнения nickel-j Компоненты Delphi 3 28.05.2010 17:02
Ограничение компьютера по времени использования snakesoftware Безопасность, Шифрование 3 03.05.2010 14:44
Измерение времени выполнения цикла Alexcomeback Общие вопросы C/C++ 10 25.04.2009 16:58
ограничение по времени bunner Помощь студентам 4 05.02.2009 21:31