PDA

Просмотр полной версии : Задержка выполнения программы.[Delphi]


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

[ac1D]
22.05.2010, 23:27
Sleep();

AlexTheC0d3r
22.05.2010, 23:30
Есть программа,первая часть выполняется сразу.
Хочу сделать,чтобы вторая часть программы выполнялась через 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
компонент Timer чем не вариант?
P.s. при sleep программа "подвисает"
при Sleep() она замораживается...
Есть аналог в виде Delay (http://www.delphisources.ru/pages/faq/base/delay_func.html), но я не рекомендую его использовать

AlexTheC0d3r
22.05.2010, 23:35
']
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
Советую перейти от такого создания потоков к 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
ппц... вы тут такие вещи творите....

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


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

Faost
24.05.2010, 20:58
ппц... вы тут такие вещи творите....

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ий пункт моего пред.поста.