Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Задержка выполнения программы.[Delphi] (https://forum.antichat.xyz/showthread.php?t=206017)

ZnikiR 22.05.2010 23:26

Задержка выполнения программы.[Delphi]
 
Есть программа,первая часть выполняется сразу.
Хочу сделать,чтобы вторая часть программы выполнялась через 5 минут после запуска программы.
Можно ли это реализовать?

[ac1D] 22.05.2010 23:27

Sleep();

AlexTheC0d3r 22.05.2010 23:30

Цитата:

Сообщение от ZnikiR
Есть программа,первая часть выполняется сразу.
Хочу сделать,чтобы вторая часть программы выполнялась через 5 минут после запуска программы.
Можно ли это реализовать?

Создать дополнительный поток при старте, и в нем с самого начала Sleep(5*60*1000);
:)

гугли CreateThread();

h(f)ucker 22.05.2010 23:30

компонент Timer чем не вариант? (ну или для второй части можно задать какое-либо(любое) условие для выполнения)
P.s. при sleep программа "подвисает"

[ac1D] 22.05.2010 23:31

Код:

TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TNewThread.Execute;
begin
  Sleep(5000);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  NewThread: TNewThread;
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
end;


AlexTheC0d3r 22.05.2010 23:32

Цитата:

Сообщение от h(f)ucker
компонент Timer чем не вариант?
P.s. при sleep программа "подвисает"

при Sleep() она замораживается...
Есть аналог в виде Delay (http://www.delphisources.ru/pages/faq/base/delay_func.html), но я не рекомендую его использовать

AlexTheC0d3r 22.05.2010 23:35

Цитата:

Сообщение от [ac1D]
Код:

TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TNewThread.Execute;
begin
  Sleep(5000);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  NewThread: TNewThread;
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
end;



Советую перейти от такого создания потоков к CreateThread()... в данном случае код получится намного компактнее и эффективнее

ZnikiR 23.05.2010 17:20

Так сейчас пробывал,ничего не получилось.
Можешь показать как сделать комактнее?

miako 24.05.2010 02:16

Скинь код, посмотрим что там не получилось. Сдесь не экстрасенсы:)

M_script_ 24.05.2010 07:46

Цитата:

Сообщение от AlexTheC0d3r
Советую перейти от такого создания потоков к CreateThread()... в данном случае код получится намного компактнее и эффективнее

Чем эффективнее?

heretic1990 24.05.2010 16:44

Код:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
первая часть программы :=false:

Timer2.Enabled:= True;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin

вторая часть программы :=true:
Timer1.Enabled:= false;
Timer2.Enabled:= false;
end;

останется только настроить интервал для таймера

Ildon 24.05.2010 17:16

А вот те слип при котором не бует зависонов )

Код:

int time=GetTickCount();
while((GetTickCount()-time)<1000))//Или меняй задержку на свою
          {
          Application->ProcessMessages();
          }


Faost 24.05.2010 17:20

function proc(): integer;
begin
Sleep(Твое время задержки);
//Твои действия "второй части" (потока).
result:= 0;
end;

var id: DWORD;
begin
CreateThread(nil, 0, @proc, nil, 0, id);
//Твои действия "первой части" (потока);
//Если эта часть кода может выполниться за время (или раньше), которое ты поставил в Sleep выше, то раскоменировать след.строку и возложить завершение проги на второй поток (функцию proc).
//Sleep(infinite);
end.

Вариант 2:

function proc(): integer;
begin
Sleep(Твое время задержки);
//Твои действия "второй части" (потока).
result:= 0;
end;

var id: DWORD;
h: THandle;
begin
h:= CreateThread(nil, 0, @proc, nil, 0, id);
//Твои действия "первой части" (потока);
WaitForSingleObject(h, infinite); //ждем завершения созданного потока.
end.

AlexTheC0d3r 24.05.2010 20:14

Цитата:

//Sleep(infinite);
ппц... вы тут такие вещи творите....

Ildon, Нельзя на это полагаться, еще раз повторяю

Ildon 24.05.2010 20:46

Цитата:

Сообщение от AlexTheC0d3r
ппц... вы тут такие вещи творите....

Ildon, Нельзя на это полагаться, еще раз повторяю


Скоко раз так делал все нормально было

Faost 24.05.2010 20:58

Цитата:

Сообщение от AlexTheC0d3r
ппц... вы тут такие вещи творите....

Ildon, Нельзя на это полагаться, еще раз повторяю

1. Скажи, что плохого в этих "вещах" и приведи пример.
2. Предложи лучший вариант.
3. Без выполнения пунктов 1 и 2 не нужно говорить того, что ты говоришь, ибо это тебя не красит как человека, разбирающегося в этих "вещах".

AlexTheC0d3r 24.05.2010 21:24

Во-первых, в функции потока необходимо
Цитата:

ExitThread(0);
Во-вторых, и чтобы не было этого бредового
Цитата:

Sleep(infinite);
, есть специальная функция
Цитата:

WaitForSingleObject();
Цитата:

Скоко раз так делал все нормально было
Если ты так делал, и было нормально, это совсем не означает что это правильно!
Еще раз повторяю, нет гарантии, что
Цитата:

ProcessMessages();
будет выполняться определенное время/


Надеюсь теперь понятно.

UPD:
Цитата:

function proc(): integer;
begin
Sleep(Твое время задержки);
//Твои действия "второй части" (потока).
result:= 0;
end;

var id: DWORD;
h: THandle;
begin
h:= CreateThread(nil, 0, @proc, nil, 0, id);
//Твои действия "первой части" (потока);
WaitForSingleObject(h, infinite); //ждем завершения созданного потока.
end.
Цитата:

ExitThread(0);
где? Иначе программа никогда не завершится

Faost 24.05.2010 21:45

AlexTheC0d3r,
Цитата:

Во-первых, в функции потока необходимо ExitThread(0);
Цитата:

Завершение рабочего потока выполняется просто: нужно просто завершить контролирующую функцию и возвратить значение, обозначающее причину завершения потока. Для этого можно использовать оператор return. (с) msdn.
Далее.
Я не вижу от тебя примера, где бы return (result) давал сбой, да и в msdn ясно написано, что return вполне подходит для выхода из потока. WTF?
Цитата:

есть специальная функция WaitForSingleObject();
смотри в моем посте вариант 2 (дописал ранее твоего поста). Однако и тут я не вижу от тебя примера, которым бы ты показал, что Sleep(infinite) - бредовый.
Цитата:

ExitThread(0); где? Иначе программа никогда не завершится
дружище, посмотри на тему, там присутствует слово Delphi. Borland`овские кодеры взяли этот вопрос на себя.
Прошу еще раз обратить внимание на 3ий пункт моего пред.поста.


Время: 00:56