Просмотр полной версии : Аналог sleep в дельфи
Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке?
procedure Thread.Execute;
begin
while true do
begin
Synchronize(DoWork);
sleep(500);
end;
end;
З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
WaitForSingleObject(GetCurrentThread(), 5000);
Спасибо, только еще хуже стало :)
на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает.
Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete
А вот рабочий стол со всем содержимым впадает в ступор.
Форма отрисовывется, а вот скрытие ее не срабатывает.
Не знаю, может поможет:
>> Процедура Delay (как в паскале)
Зависимости: Forms,Windows,SysUtils
Автор: demon-777, demon-777@yandex.ru, Питер
Copyright: Выдрана из RxLib
Дата: 23 мая 2002 г.
************************************************** *** }
{Delay, не загружающий процессор}
procedure Delay(Value: Cardinal);
var
F, N: Cardinal;
begin
N := 0;
while N <= (Value div 10) do
begin
SleepEx(1, True);
Application.ProcessMessages;
Inc(N);
end;
F := GetTickCount;
repeat
Application.ProcessMessages;
N := GetTickCount;
until (N - F >= (Value mod 10)) or (N < F);
end;
Пример использования:
Delay(1000); //Задержка на одну секунду
прога не оконная
Ой, sorry, протупил, значит не поможет :(
ппц вы гении. Автор, у тебя чтото с кодом наверное, а не с функций Sleep. Потому что она останавливает выполнение потока из которого она выполнена.
Вырезка из MSDN
The Sleep function suspends the execution of the current thread for a specified interval.
Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread
не морочь голову с TThread и тд а создавай новый поток через апи CreateThread. используй в процедуре обработки апи Sleep() и все будет впорядке.
вот пример, правда на си
DWORD WINAPI TypingThread(LPVOID arg)
{
for(int i=0; i<5; i++){
printf("Xaxaxa\r\n");
Sleep(2000);
}
printf("thread end\r\n");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hthread;
DWORD tid;
hthread = CreateThread(0,0,TypingThread,NULL,0,&tid);
for(int i=0; i<15; i++){
printf("tmain()\r\n");
Sleep(1000);
}
printf("program end\r\n");
return 0;
}
вывод:
c:\123123\Debug>123123
tmain()
Xaxaxa
tmain()
Xaxaxa
tmain()
tmain()
Xaxaxa
tmain()
tmain()
tmain()
Xaxaxa
tmain()
Xaxaxa
tmain()
tmain()
thread end
tmain()
tmain()
tmain()
tmain()
tmain()
program end
c:\123123\Debug>
M_script_
24.09.2009, 19:28
В чем-то другом проблема. Sleep() в созданном потоке не влияет на работу основного.
Только почему ты пишешь "делаю слип 5 секунд", а в коде Sleep(500) - полсекунды?
З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
Это ты неправильно понял, VCL можно использовать в консольных прогах.
а если
Sleep(500);
Application.ProcessMessages;
jaypi, ага, или for i:=1 to 1000 do sleep (5); :)
2pick, как ни крути, не будет неосновной поток вешать систему. В том вся и прелесть.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot