![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно сделать паузу по времени? [D7, WinXP]
Zilog © (2008-12-16 15:47:00)Как правильно сделать паузу по времени?
скжем, работает поток, в котором я хочу сделать паузу в 10 минут. Как это сделать?
Если память не изменяет, надо получить системное время + колво времени паузы, и сидеть в цикле пока текущее не сравняется с заданным.. так?
Функции бы ещё кто-нибудь напомнил..
Loginov Dmitry (2008-12-16 23:22:00) [1]> скжем, работает поток, в котором я хочу сделать паузу в
> 10 минут. Как это сделать?
> Если слип большой делать - поток зависает на это время,
> а мне надо контролировать необходимость выхода из него.
для подобных требований удобно использовать эвенты.
Нужны 3 функции:
-CreateEvent()
-SetEvent()
-WaitForSingleObject()
Где-нибудь создаешь эвент в состоянии RESET (занят). (HEvent := CreateEvent(nil, True, False, nil))
В потоке для осуществления задержки вызываешь вместо Sleep() функциюWaitForSingleObject(HEvent, 10*60*1000).
для досрочного прерывания задержки используешь функцию SetEvent(HEvent) (можно из любого потока),
которая переводит эвент в состояние "свободен".
Когда эвент не нужен, можно его удалить (CloseHandle(HEvent))
Anatoly Podgoretsky (2008-12-16 18:25:00) [2]> Zilog (16.12.2008 17:32:04) [4]
Приведеный код неверный, результат фунции CreateProcess bool, а не boоlean
Zilog (2008-12-16 18:03:00) [3]Ega23, спасибо!
Остался ещё один вопрос - желаю проинформировать общественность, сколько осталось до окончания паузы. Как бы это вычислить?
Ega23 (2008-12-16 17:43:00) [4]
> Если слип большой делать - поток зависает на это время,
> а мне надо контролировать необходимость выхода из него.
> Если делать цикл - то это нарушает течение времени...
Элементарно, Ватсон.
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 сбросится.
Jeer (2008-12-16 17:36:00) [5]
> Если делать цикл - то это нарушает течение времени...
>
Ну вот, а мы боялись какого-то адронного коллайдера.
А, прямо сейчас, человек уже нарушает нам течение времени.
Брось это занятие.
Zilog (2008-12-16 17:32:00) [6]Anatoly Podgoretsky, незнаю, кто дал совет - давным давно кто то тут акое предлагал.
Если слип большой делать - поток зависает на это время, а мне надо контролировать необходимость выхода из него. Если делать цикл - то это нарушает течение времени...
Ega23 (2008-12-16 16:59:00) [7]
> Если память не изменяет, надо получить системное время +
> колво времени паузы, и сидеть в цикле пока текущее не сравняется
> с заданным.. так?
>
Нет, не так.
1. Осенью время имеет обыкновение прыгать на час назад, а весной - на час вперёд.
2. Даже если время брать в UTC, то всё равно я ручками могу время перевести, хоть на год назад. Год + час будешь ждать? :)
Anatoly Podgoretsky (2008-12-16 16:02:00) [8]> Zilog (16.12.2008 15:47:00) [0]
Хакер дал такой совет или ламер?
Sleep смотри
clickmaker (2008-12-16 15:53:00) [9]Sleep(10 * 60 * 1000)