Текущий архив: 2009.02.01;
Скачать: CL | DM;
Вниз
Как правильно сделать паузу по времени? Найти похожие ветки
← →
Zilog (2008-12-16 15:47) [0]Как правильно сделать паузу по времени?
скжем, работает поток, в котором я хочу сделать паузу в 10 минут. Как это сделать?
Если память не изменяет, надо получить системное время + колво времени паузы, и сидеть в цикле пока текущее не сравняется с заданным.. так?
Функции бы ещё кто-нибудь напомнил..
← →
clickmaker © (2008-12-16 15:53) [1]Sleep(10 * 60 * 1000)
← →
Anatoly Podgoretsky © (2008-12-16 16:02) [2]> Zilog (16.12.2008 15:47:00) [0]
Хакер дал такой совет или ламер?
Sleep смотри
← →
Ega23 © (2008-12-16 16:59) [3]
> Если память не изменяет, надо получить системное время +
> колво времени паузы, и сидеть в цикле пока текущее не сравняется
> с заданным.. так?
>
Нет, не так.
1. Осенью время имеет обыкновение прыгать на час назад, а весной - на час вперёд.
2. Даже если время брать в UTC, то всё равно я ручками могу время перевести, хоть на год назад. Год + час будешь ждать? :)
← →
Zilog (2008-12-16 17:32) [4]Anatoly Podgoretsky, незнаю, кто дал совет - давным давно кто то тут акое предлагал.
Если слип большой делать - поток зависает на это время, а мне надо контролировать необходимость выхода из него. Если делать цикл - то это нарушает течение времени...
← →
Jeer © (2008-12-16 17:36) [5]
> Если делать цикл - то это нарушает течение времени...
>
Ну вот, а мы боялись какого-то адронного коллайдера.
А, прямо сейчас, человек уже нарушает нам течение времени.
Брось это занятие.
← →
Ega23 © (2008-12-16 17:43) [6]
> Если слип большой делать - поток зависает на это время,
> а мне надо контролировать необходимость выхода из него.
> Если делать цикл - то это нарушает течение времени...
Элементарно, Ватсон.
TMyThread = class (TThread);
private
FNextExec : Cardinal;
protected
procedure Execute; override;
public
constructor Create;
end;
constructor TMyThread.Create;
begin
FNextExec := GetTickCount;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
try
if GetTickCount<FNextExec then Continue;
...... Работа Execute;
FNextExec := GetTickCount + 600000;
finally
Sleep(20);
end;
end;
end;
Ну и учитываешь, что при ап-тайме компа в 49 с чем-то там суток счетчик GetTickCount в 0 сбросится.
← →
Zilog (2008-12-16 18:03) [7]Ega23, спасибо!
Остался ещё один вопрос - желаю проинформировать общественность, сколько осталось до окончания паузы. Как бы это вычислить?
← →
Anatoly Podgoretsky © (2008-12-16 18:25) [8]> Zilog (16.12.2008 17:32:04) [4]
Приведеный код неверный, результат фунции CreateProcess bool, а не boоlean
← →
Loginov Dmitry © (2008-12-16 23:22) [9]> скжем, работает поток, в котором я хочу сделать паузу в
> 10 минут. Как это сделать?
> Если слип большой делать - поток зависает на это время,
> а мне надо контролировать необходимость выхода из него.
для подобных требований удобно использовать эвенты.
Нужны 3 функции:
-CreateEvent()
-SetEvent()
-WaitForSingleObject()
Где-нибудь создаешь эвент в состоянии RESET (занят). (HEvent := CreateEvent(nil, True, False, nil)
)
В потоке для осуществления задержки вызываешь вместо Sleep() функциюWaitForSingleObject(HEvent, 10*60*1000)
.
для досрочного прерывания задержки используешь функцию SetEvent(HEvent) (можно из любого потока),
которая переводит эвент в состояние "свободен".
Когда эвент не нужен, можно его удалить (CloseHandle(HEvent)
)
Страницы: 1 вся ветка
Текущий архив: 2009.02.01;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.005 c