Есть программа,первая часть выполняется сразу. Хочу сделать,чтобы вторая часть программы выполнялась через 5 минут после запуска программы. Можно ли это реализовать?
Создать дополнительный поток при старте, и в нем с самого начала Sleep(5*60*1000); гугли CreateThread();
компонент Timer чем не вариант? (ну или для второй части можно задать какое-либо(любое) условие для выполнения) P.s. при sleep программа "подвисает"
Code: 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;
при Sleep() она замораживается... Есть аналог в виде Delay (http://www.delphisources.ru/pages/faq/base/delay_func.html), но я не рекомендую его использовать
Советую перейти от такого создания потоков к CreateThread()... в данном случае код получится намного компактнее и эффективнее
Code: 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; останется только настроить интервал для таймера
А вот те слип при котором не бует зависонов ) Code: 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.
1. Скажи, что плохого в этих "вещах" и приведи пример. 2. Предложи лучший вариант. 3. Без выполнения пунктов 1 и 2 не нужно говорить того, что ты говоришь, ибо это тебя не красит как человека, разбирающегося в этих "вещах".
Во-первых, в функции потока необходимо Во-вторых, и чтобы не было этого бредового , есть специальная функция Если ты так делал, и было нормально, это совсем не означает что это правильно! Еще раз повторяю, нет гарантии, что будет выполняться определенное время/ Надеюсь теперь понятно. UPD: где? Иначе программа никогда не завершится
AlexTheC0d3r, Далее. Я не вижу от тебя примера, где бы return (result) давал сбой, да и в msdn ясно написано, что return вполне подходит для выхода из потока. WTF? смотри в моем посте вариант 2 (дописал ранее твоего поста). Однако и тут я не вижу от тебя примера, которым бы ты показал, что Sleep(infinite) - бредовый. дружище, посмотри на тему, там присутствует слово Delphi. Borland`овские кодеры взяли этот вопрос на себя. Прошу еще раз обратить внимание на 3ий пункт моего пред.поста.