Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

20.09.2009, 00:09
|
|
Познающий
Регистрация: 17.03.2007
Сообщений: 98
Провел на форуме: 193152
Репутация:
45
|
|
Аналог sleep в дельфи
Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке?
Код:
procedure Thread.Execute;
begin
while true do
begin
Synchronize(DoWork);
sleep(500);
end;
end;
З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
Последний раз редактировалось 2pick; 20.09.2009 в 00:11..
|
|
|

20.09.2009, 00:29
|
|
Участник форума
Регистрация: 05.06.2009
Сообщений: 127
Провел на форуме: 1313455
Репутация:
249
|
|
WaitForSingleObject(GetCurrentThread(), 5000);
|
|
|

20.09.2009, 01:27
|
|
Познающий
Регистрация: 17.03.2007
Сообщений: 98
Провел на форуме: 193152
Репутация:
45
|
|
Спасибо, только еще хуже стало 
на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает.
Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete
А вот рабочий стол со всем содержимым впадает в ступор.
Форма отрисовывется, а вот скрытие ее не срабатывает.
Последний раз редактировалось 2pick; 20.09.2009 в 01:35..
|
|
|

20.09.2009, 10:31
|
|
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме: 435863
Репутация:
80
|
|
Не знаю, может поможет:
Код:
>> Процедура 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, протупил, значит не поможет 
|
|
|

20.09.2009, 10:50
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
ппц вы гении. Автор, у тебя чтото с кодом наверное, а не с функций Sleep. Потому что она останавливает выполнение потока из которого она выполнена.
Вырезка из MSDN
The Sleep function suspends the execution of the current thread for a specified interval.
Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread
Последний раз редактировалось slesh; 20.09.2009 в 14:05..
|
|
|

21.09.2009, 12:54
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
не морочь голову с 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>
Последний раз редактировалось sn0w; 21.09.2009 в 13:33..
|
|
|

24.09.2009, 19:28
|
|
Постоянный
Регистрация: 29.10.2008
Сообщений: 306
Провел на форуме: 1819761
Репутация:
180
|
|
В чем-то другом проблема. Sleep() в созданном потоке не влияет на работу основного.
Только почему ты пишешь "делаю слип 5 секунд", а в коде Sleep(500) - полсекунды?
Сообщение от 2pick
З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
Это ты неправильно понял, VCL можно использовать в консольных прогах.
|
|
|

25.09.2009, 13:03
|
|
Познающий
Регистрация: 19.08.2009
Сообщений: 44
Провел на форуме: 128359
Репутация:
2
|
|
а если
Код:
Sleep(500);
Application.ProcessMessages;
|
|
|

26.09.2009, 09:37
|
|
Banned
Регистрация: 25.11.2007
Сообщений: 62
Провел на форуме: 1702086
Репутация:
89
|
|
jaypi, ага, или for i:=1 to 1000 do sleep (5);
2pick, как ни крути, не будет неосновной поток вешать систему. В том вся и прелесть.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|