• XSS.stack #1 – первый литературный журнал от юзеров форума

Заморозка цикла на определёный тайм

Статус
Закрыто для дальнейших ответов.

eXa

CD-диск
Пользователь
Регистрация
28.08.2006
Сообщения
19
Реакции
0
H! Надеюсь тут поможите :)
Как можно заморозить цикл на определенное время с помощью таймера, при двух условиях:
1) Цикл находится в функции и только в ней
2) Нельзя объявлять глобальные переменные
Вот вообщем:
Код:
function mail: string;
var
Ls: TStringList;
i: inteher;
begin
for i:=1 to 10 do
 begin
  Ls := TStringList.Create;
  Ls.LoadFromFile('mail.txt');
  mail:= Ls.Strings[i];
//тут должен находиться код каторый будет тормозить цикл на час, но не тормозить весь код,как в случии sleep, вообщем условие какое то
end;
 
но не тормозить весь код,как в случии sleep
А с чего ты взял что слип тормозит весь код? Он просто передаёт управление от текущего потока системе, на указанный промежуток времени.

А чтоб не "тормозило весь код" обрабатывай эту функцию в отдельном потоке(CreateThread), или создай таймер, а после десятого вызова выключи его.

[offtop]PS А вообще бросай ты этот делфи и учи Ассемблур :D[/offtop]
 
или создай таймер, а после десятого вызова выключи его
Можеш показать пример кода или пояснить чуть более развёрнутей? Конеш лучш первый вариант)

[offtop]Я бросил изучать АСМ и начал Делфи, наверно лучш начинать с самого простого, чем с самого сложного=)[offtop]

обрабатывай эту функцию в отдельном потоке

С потоком не работает, выдаёт ошибку... Или надо лбязательно создавать класс?

Код:
var
th1: cardinal;
h1: integer;

function mail: string;
var
Ls: TStringList;
i: integer;
begin
for i:=1 to 10 do
begin
 Ls := TStringList.Create;
 Ls.LoadFromFile('mail.txt');
 mail:= Ls.Strings[i];
 form1.Edit1.Text:= mail;
 sleep(10);
 end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
h1 := beginthread(nil, 1024, @mail, nil, 0, th1);
end;
 
Не целесообразно с каждым циклом создавать новый TStringList, не удалять его после окончания использования, неговоря уже об переоткрытии одного и того же файла.

Посылай текст кTEdit'у так:
SendMessage(Form1.Edit1.Handle, WM_SETTEXT, 0, integer(pchar(str)));
 
Sleep()
и не морочить себе голову

Можно сделать тред отдельный обработки сообщений => прога не будет "виснуть", как это обычно кажется при вызове Sleep
 
Хоть и говорят, что Application.ProcessMessages дурной тон, я не догоняю почему :)

Код:
procedure Delay(Time: Cardinal);
var
  Ticks: Cardinal;
begin
  Ticks:= GetTickCount;
  while GetTickCount - Ticks < Time do
  begin
    SleepEx(50, True);
    Application.ProcessMessages 
  end; 
end;
 
Не целесообразно с каждым циклом создавать новый TStringList, не удалять его после окончания использования, неговоря уже об переоткрытии одного и того же файла.

Посылай текст кTEdit'у так:
SendMessage(Form1.Edit1.Handle, WM_SETTEXT, 0, integer(pchar(str)));

Ну а если так, вызываю один раз и удоляю, открываю фаил один раз тоже получается, ошибку всё равно выдаёт.
Код:
function mail: string;
var
Ls: TStringList;
i: integer;
begin
 Ls := TStringList.Create;
 Ls.LoadFromFile('mail.txt');
for i:=1 to 10 do
 begin
 mail:= Ls.Strings[i];
 Ls.Free;
 sleep(1000);
 end;
end;

А насчёт посылание текста, мне это впринципе и не нужно, это только для проверки, главное чтоб в переменную mail записывался e-mail

Great один sleep и так задействован, на задержку 60 сек, в любом случии мне надо в потоке

Sax-mmS надо обойтись без процедуры
 
Твоя функция mail вообще не рабочая, ты как додумался объект внутри цикла уничтожать-то? И откуда такие границы цикла? Вообще то нумерация строк в TStringList идет с 0.

Sax-mmS надо обойтись без процедуры

А в чем проблема? Проблемма может быть тока если ты не юзаешь Forms и у тя нет объекта Application

Код:
function mail: string;
var
  Ls: TStringList;
  i: integer;

  procedure SubDelay(Time: Cardinal);
  var
    Ticks: Cardinal;
  begin
    Ticks:= GetTickCount;
    while GetTickCount - Ticks < Time do
    begin
      SleepEx(50, True);
      Application.ProcessMessages 
    end;
  end;
 
begin
  Ls := TStringList.Create;
  Ls.LoadFromFile('mail.txt');

  for i:=0 to Ls.Count-1 do
  begin
    mail:= Ls.Strings[i];
    //sleep(1000);
    SubDelay(1000);
   end;

  Ls.Clear;
  FreeAndNil(Ls); // или просто Ls.Free если SysUtils не юзаешь
end;
 
не юзаешь Forms и у тя нет объекта Application
тогда о каком подтормаживании вообще идет речь))))
Sleep криво выглядит, когда юзается в обработчике Windows-сообщений - окно кажется "зависшим", в следствие чего приходится обрабатывать сообщения в параллельном потоке, или поочередно прерываясь на их обработку.
Нет окна - нет пробллем =)
 
Твоя функция mail вообще не рабочая, ты как додумался объект внутри цикла уничтожать-то? И откуда такие границы цикла? Вообще то нумерация строк в TStringList идет с 0.

Так он и занаво создавался в цикле=) Может это криво со стороны кодинго, но мне можно(новичёк:baby: ) Зная что с нуля, это не важно...

А в чем проблема? Проблемма может быть тока если ты не юзаешь Forms и у тя нет объекта Application

Значение функции, идёт в процедуру, если можно было задать так процедуру procedure mail: string; то проблем не было бы, или я чёт недоганяю... И ещё глобальные переменные нельзя было использовать. А вот то что в функции можно процедуру задать для меня это открытие, думаю терь всё ОКИ будет!

Great а про подтормаживание никто и ничё не говарил...
 
Great а про подтормаживание никто и ничё не говарил...
а это про что?

но не тормозить весь код,как в случии sleep,
 
Про то, что 2 sleep'a в одном потоке это плохо...

Вообщем извеняюсь что марочил вам мозги насчёт того что нельзя было использовать процедуры и глобальные переменные в коде, всё там можно, чёт ток ща догнал до этого :unsure: Ну тему можно прикрыть, было бы постов у меня побольше репутация поднял бы вам...
 
Статус
Закрыто для дальнейших ответов.
Верх