Нигде не нашел ответа... Может кто поможет. Ситуация следующая - в потоке (поток зациклен) произвожу действия и дальше нужно сделать паузу и менно в потоке - sleep как я понял весит всю прогу на слип. Ибо когда делаю слип 5 секунд то прога тупить начинает. Каким образом можно сделать задержку именно в потоке? Code: procedure Thread.Execute; begin while true do begin Synchronize(DoWork); sleep(500); end; end; З.Ы.: прога не оконная (точнее окна создаются через API) поэтому как я понял TTimer не подходит
Спасибо, только еще хуже стало на 1 секунде уже всю систему весит... А вот слип 1 секунду нормально отрабатывает. Кстати прога тупить начинает именно веся всю систему. Точнее системные сочетения кнопок работают Alt+Tab, Ctrl+Alt+Delete А вот рабочий стол со всем содержимым впадает в ступор. Форма отрисовывется, а вот скрытие ее не срабатывает.
Не знаю, может поможет: Code: >> Процедура 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 Вполне возможно это из-за того что ты сделал потоки на основе класса TThread. Попробуй потоки на WinAPI организовать - CreateThread
не морочь голову с TThread и тд а создавай новый поток через апи CreateThread. используй в процедуре обработки апи Sleep() и все будет впорядке. вот пример, правда на си Code: 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>
В чем-то другом проблема. Sleep() в созданном потоке не влияет на работу основного. Только почему ты пишешь "делаю слип 5 секунд", а в коде Sleep(500) - полсекунды? Это ты неправильно понял, VCL можно использовать в консольных прогах.
jaypi, ага, или for i:=1 to 1000 do sleep (5); 2pick, как ни крути, не будет неосновной поток вешать систему. В том вся и прелесть.