Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно сделать паузу по времени? [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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо