PDA

Просмотр полной версии : Аналог sleep в дельфи


2pick
20.09.2009, 00:09
Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке?


procedure Thread.Execute;
begin
while true do
begin
Synchronize(DoWork);
sleep(500);
end;
end;



З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит

Dosia
20.09.2009, 00:29
WaitForSingleObject(GetCurrentThread(), 5000);

2pick
20.09.2009, 01:27
Спасибо, только еще хуже стало :)
на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает.

Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete
А вот рабочий стол со всем содержимым впадает в ступор.
Форма отрисовывется, а вот скрытие ее не срабатывает.

Sams
20.09.2009, 10:31
Не знаю, может поможет:

>> Процедура 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, протупил, значит не поможет :(

slesh
20.09.2009, 10:50
ппц вы гении. Автор, у тебя чтото с кодом наверное, а не с функций Sleep. Потому что она останавливает выполнение потока из которого она выполнена.

Вырезка из MSDN

The Sleep function suspends the execution of the current thread for a specified interval.


Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread

sn0w
21.09.2009, 12:54
не морочь голову с 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 можно использовать в консольных прогах.

jaypi
25.09.2009, 13:03
а если

Sleep(500);
Application.ProcessMessages;

Пуховой
26.09.2009, 09:37
jaypi, ага, или for i:=1 to 1000 do sleep (5); :)

2pick, как ни крути, не будет неосновной поток вешать систему. В том вся и прелесть.