Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.014 c
15-1228732709
1234567
2008-12-08 13:38
2009.02.01
mwEdit


15-1228738263
Хитрий Лис
2008-12-08 15:11
2009.02.01
Подскажите по лицензированию


3-1214121493
vetalich
2008-06-22 11:58
2009.02.01
не подскажите формулу по которой можно вычислить...?


6-1197769024
Real
2007-12-16 04:37
2009.02.01
TNMFTP и большие файлы


2-1229506635
abhtr
2008-12-17 12:37
2009.02.01
Проблема с rchForReport: TRichEdit