PDA

Просмотр полной версии : Запаузить поток Delphi


imreadyourmind
23.04.2010, 19:34
Кто-как делаетт паузы в потоке?
Слиип и вейтфоробджект вешают программу(
Если использовать суспенд прямо в потоке, то возобновлять поток можно только вне потока.

К примеру если мне нужно запаузить поток на 20 секунд.
Я делал суперизвратно, вот таким способом.

Паузил поток суспендом и запускал вне потока таймер, по истечению которого поток опять запускался. Таким способом появляется максимум траблов и глюков.

Есть какие-нибудь адекватные способы запаузить поток на определенное кол-во времени, не вещая программу?

gisTy
23.04.2010, 19:40
пускать sleep если установлен флаг?

GhostOnline
23.04.2010, 19:41
Самый безглючный вариант - создать глобальную переменную булева типа, а в потоке регулярно проверять её состояние:
while Pause do sleep(1);

imreadyourmind
23.04.2010, 19:44
пускать sleep если установлен флаг?
слип вешает программу!
Самый безглючный вариант - создать глобальную переменную булева типа, а в потоке регулярно проверять её состояние:
while Pause do sleep(1);
Это понятно, но слип вешает программу))
А мне нужно чтобы к примеру 1 из 100 потоков остановился а остальные 99 продолжали работать. А слип повесит всю 100 потоков.

gisTy
23.04.2010, 19:45
а ты не пробовал слип в потоке запускать?

imreadyourmind
23.04.2010, 19:47
а ты не пробовал слип в потоке запускать?
Ты сам то пробовал?)))))))) Вешет слип всю программу.Вместе со всеми потоками, пробовал не раз.

GhostOnline
23.04.2010, 19:48
а ты не пробовал слип в потоке запускать?
+1. ТС в потоке слип не повесит программу, проверено
А чтобы можно было только один поток запаузить добавляй в класс потока свойство Pause, тогда у каждого потока свой флаг паузы

Ты сам то пробовал?)))))))) Вешет слип всю программу.Вместе со всеми потоками, пробовал не раз.
бред, ты что-то неправильно делаешь. Я гарантирую это!!11

Sleep - апишная функция, для текущего потока

imreadyourmind
23.04.2010, 19:49
Щас скину исходник и ехе)))))))

imreadyourmind
23.04.2010, 19:59
Все разобрался. если слип использовать в функции которая используется в синхронайз, то вешается все полностью. Если использовать слип в execute то вешается только один поток))))) Все верно)Сенкс)

M_script_
23.04.2010, 20:56
Синхронайзы - зло, слишком не увлекайся ими ;)

imreadyourmind
23.04.2010, 20:57
Синхронайзы - зло, слишком не увлекайся ими
Без синхронизации будет хуже))

GhostOnline
23.04.2010, 21:00
Синхронайзы - зло, слишком не увлекайся ими ;)
Ага, это точно.
Ставил эксперимент: 100 потоков двигают прогрессбар двумя разными способами: синхронайзом и оконными сообщениями. так в первом случае прогресс до 1000000 двигался 32 секунды, нагрузка на проц 50-60%(!), а во втором случае двигался 20 сек, а нагрузка стремилась к нулю!