Просмотр полной версии : Задержка выполнения программы.[Delphi]
Есть программа,первая часть выполняется сразу.
Хочу сделать,чтобы вторая часть программы выполнялась через 5 минут после запуска программы.
Можно ли это реализовать?
AlexTheC0d3r
22.05.2010, 23:30
Есть программа,первая часть выполняется сразу.
Хочу сделать,чтобы вторая часть программы выполнялась через 5 минут после запуска программы.
Можно ли это реализовать?
Создать дополнительный поток при старте, и в нем с самого начала Sleep(5*60*1000);
:)
гугли CreateThread();
h(f)ucker
22.05.2010, 23:30
компонент Timer чем не вариант? (ну или для второй части можно задать какое-либо(любое) условие для выполнения)
P.s. при sleep программа "подвисает"
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()... в данном случае код получится намного компактнее и эффективнее
Так сейчас пробывал,ничего не получилось.
Можешь показать как сделать комактнее?
Скинь код, посмотрим что там не получилось. Сдесь не экстрасенсы:)
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;
останется только настроить интервал для таймера
А вот те слип при котором не бует зависонов )
int time=GetTickCount();
while((GetTickCount()-time)<1000))//Или меняй задержку на свою
{
Application->ProcessMessages();
}
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, Нельзя на это полагаться, еще раз повторяю
Скоко раз так делал все нормально было
ппц... вы тут такие вещи творите....
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); где? Иначе программа никогда не завершится
AlexTheC0d3r,
Во-первых, в функции потока необходимо ExitThread(0);
Завершение рабочего потока выполняется просто: нужно просто завершить контролирующую функцию и возвратить значение, обозначающее причину завершения потока. Для этого можно использовать оператор return. (с) msdn.
Далее.
Я не вижу от тебя примера, где бы return (result) давал сбой, да и в msdn ясно написано, что return вполне подходит для выхода из потока. WTF?
есть специальная функция WaitForSingleObject();
смотри в моем посте вариант 2 (дописал ранее твоего поста). Однако и тут я не вижу от тебя примера, которым бы ты показал, что Sleep(infinite) - бредовый.
ExitThread(0); где? Иначе программа никогда не завершится
дружище, посмотри на тему, там присутствует слово Delphi. Borland`овские кодеры взяли этот вопрос на себя.
Прошу еще раз обратить внимание на 3ий пункт моего пред.поста.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot