Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 14:52   #1
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию Sleep в потоке

Как правильно нужно использовать слип в потоке? После слипа, поток зависает либо уничтожается .. и дальнейшие действия никакие не выполняются.

И работает он как то не понятно. У меня на компе, при sleep(1000), все нормально, у друга, на более мощном компьютере после слипа поток перестает выполнятся.. Может его как то можно остановить на n-секунд, а потом продолжить выполнение в этом же месте?
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 15:11   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

слип это и делает, но поток не должен быть уничтожен за это время.
и кстати, может у вас просто чтото не то с потоком(кодом) и за эту паузу чтото меняется что поток просто не может продолжить работу.(тут надо код смотреть, ибо я лично испоьзую слип если надо, и все норм)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2011, 15:31   #3
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

Ничего не происходит во врем слипа. Вся программа работает в одном потоке. Поставил лог, чтоб после каждой строчки кода, писал в мемо.

Form1.Memo1.Lines.Add('1');
sleep(1000);
Form1.Memo1.Lines.Add('2');

В итоге у меня на компе все нормально. У друга появляется в логе только цифра 1.

Но это застывание бывает не всегда. У него намного чаще. У меня реже.

Может ли это как то зависеть от процессора? Или может нужно назначать какой нибудь самый высокий или наоборот, самый низкий приоритет потока, чтобы работал на каждом компьютере и нормально, а не через раз? Дело тут уже не в коде мне кажется.
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 15:36   #4
JetUS
Пользователь
 
Аватар для JetUS
 
Регистрация: 23.09.2009
Сообщений: 27
По умолчанию

Зачем вам sleep? Возможно, есть альтернативное, более правильное решение.
JetUS вне форума Ответить с цитированием
Старый 21.06.2011, 15:36   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас обращение к VCL-компонентам в коде потока?
если да, то полет нормальный.

говорю же, надо код смотреть, за свои 6 лет, повидал такие чудеса...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2011, 15:45   #6
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

Ну весь код кидать смысла нету. Вот код конкретно где он виснет, с аномалиями какими то))

while click=0 do
begin
Synchronize(MD); //Скрин с WebBrowser, и если там присутствует определенный пиксель, присваивает переменной MDProv значение 1, если нету то 0
Form1.Memo1.Lines.Add('1');
if MDProv=0 then break; //Если даже он прервет этот цикл, то код будет выполнятся дальше, и логи дальше должны идти
count:= count+1;
if count>10 then click:=1; //С этой строкой вообще как то аномально, если ее добавляю, то виснет на слипе, если убираю, то нормально все.
Synchronize(Perezar); //Аналогично с MD
MoveS1; //функция
Synchronize(Use1); //Аналогично с MD
sleep(1000);
end;


В логах через раз вижу только цифру 1 (Form1.Memo1.Lines.Add('1'). А иногда и дальше идет. Если вставлять через каждую строчку кода, добавление в мемо1 цифры, то до слипа доходит, а дальше все.
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 15:49   #7
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

И еще есть такая особенность, что если он при первом запуске цикла не зависнет на слипе, то тогда все ок, и дальше все норм будет. А бывает что нажимаешь кнопку запуска и он раз 10 подряд виснет на слипе. Потом запустить и работает))
Florento вне форума Ответить с цитированием
Старый 21.06.2011, 15:50   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Form1.Memo1.Lines.Add('1'); тоже нужно выполнять через Synchronize
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2011, 15:50   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Если даже он прервет этот цикл, то код будет выполнятся дальше, и логи дальше
если цикл прерван и после цикла нет ничего, то чему выполнятся то?
помоему в потоке у вас потребность минимальная.
Цитата:
С этой строкой вообще как то аномально, если ее добавляю, то виснет на слипе,
виснет не на слипе а после него, ибо с цикла вышли, дальше то что?

что делает MoveS1?
и так же, переменные точно инициализированны?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.06.2011, 16:04   #10
Florento
Пользователь
 
Регистрация: 05.02.2011
Сообщений: 35
По умолчанию

В потоке большая необходимость. Скриншоты в браузере делаются каждый пол секунды, в циклах тоже много маленьких слипов. И есть клики в браузер. Без потока приложение зависает и не может кликнуть в браузер

Это этот цикл прерван, он выполняется в цикле for i=1 to 6. Даже если он прервется, то будут выполнятся условия дальше
Florento вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Sleep() ^Angel^ Общие вопросы C/C++ 9 07.05.2011 13:27
Как заменить sleep в потоке? чтобы получить задержку 5 мили Dasverd2010 Общие вопросы Delphi 13 07.09.2010 14:29
Sleep(50); за 63 мс... или за 47... Teksa Общие вопросы C/C++ 8 20.07.2010 08:34
Проблема с Sleep! k1r1ch Общие вопросы Delphi 11 20.06.2009 19:12
Аналог Sleep() Ants Общие вопросы Delphi 2 18.11.2008 13:11