67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
1

Странное поведение Thread.Sleep

05.08.2011, 18:33. Показов 2029. Ответов 2
Метки нет (Все метки)

Забавно, уже не первый раз встречаю такую вещь: делаю движение контрола по форме в цикле (самостоятельно, или по нажатым клавишам). Чтобы двигалось плавно, добавляю Thread.Sleep с каким-то маленьким значением - 1, 3, и т.д. Все прекрасно работает, но если закрыть программу, запустить что-нибудь тяжеловесное типа Photoshop, игрушки или рендеринга, поиграться и закрыть его, а потом снова запустить программу - Sleep(1) превращается в Sleep(100500) - все становится очень медленным, еле ползая по экрану. Процессор при этом работает точно так же, ресурсов больше не тратятся - просто паузы почему-то очень сильно растягиваются.

С чем это может быть связано? Попробовал ради интереса повторить это на других компьютерах - та же ситуация, хотя возникает довольно случайным образом.

Если есть какой-то простой и адекватный альтернативный способ сделать несколькомиллисекундую задержку - будет тоже круто)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2011, 18:33
Ответы с готовыми решениями:

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это "тормоз" процесса выполенения программы на 5 сек? А...

Thread.Sleep
Итак, есть примерно вот такой консольный код: static void Main(string args) { ...

Thread.Sleep не работает
Всем привет! Задача такая есть таймер который запускается каждый 30 сек и делает рассылку и...

Thread.Sleep и lock
Что будет если вызвать Thread.Sleep() внутри блока кода lock?

2
71 / 71 / 23
Регистрация: 22.05.2011
Сообщений: 528
05.08.2011, 23:48 2
Лучший ответ Сообщение было отмечено somethingrotten как решение

Решение

а ты не пробовал в таймере эти контролы двигать?
к примеру так
C#
1
2
3
4
5
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            button1.Location = new Point(button1.Location.X + 1, button1.Location.Y);
        }
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
05.08.2011, 23:59  [ТС] 3
Пробовал, конечно - но таймер, как правило, слишком медленный. Про Windows.Forms.Timer MSDN пишет, что вообще
The Windows Forms Timer component is single-threaded, and is limited to an accuracy of 55 milliseconds
Правда, там же говорят, что Timers.Timer точнее, но там тоже нет никакой разницы между Interval=10 и Interval=1.
Для движения контролов это, в принципе, вполне достаточно, но если (как в соседней теме) нужно еще и измерять расстояния между всеми контролами? А если их очень много?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.08.2011, 23:59

Thread.Sleep под капотом
Доброго времени суток! Собственно, весь вопрос в описании темы. Погуглил - мало информации и...

Аналог Thread.Sleep в Task
Имеется пример который запускает пару потоков с задержкой. using System; using...

ProgressBar связать с thread.sleep
как получать progressbar.Value в случае когда стоит задержка в 10 секунд и надо в прогресс бар...

В момент Thread.Sleep приложение не отвечает
На форме два текстовых поля, из одного из них при нажатии на кнопку получаем значение. Затем нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.