Я делаю игру wumpus world в winforms, в которой агент (компьютер) может двигаться в 4-х направлениях. Я использую кнопку управления для базы и показа и скрытия изображений, где это необходимо. я использовал Thread.Sleep для этого, но проблема в том, что когда я нажимаю кнопку, ничего не отображается в форме. процесс в фоновом режиме работает нормально, но не показывает каждый шаг. и да, я использую Thread.Sleep
в текущем потоке UI
.
Я хочу показывать пользователям каждый шаг с интервалом в 2 секунды.
Thread.Sleep или Timer для отображения каждого шага
Ответы (2)
трудно ответить без какого-либо кода, но основная проблема, насколько я понимаю, заключается в том, что вы меняете внешний вид мира, а затем говорите ему спать, ведь это означает, что ничего не будет нарисовано. а потом, когда нить проснется, ты снова меняешь мир и заставляешь его спать. ничего так не покрасится.
лучшим способом сделать это будет таймер, сделайте его одним таймером и очередью событий, которые нужно показать, и вы уже на пути к этому.
вы работаете над winForms, потому что, если вы работаете над WPF, вы можете делать гораздо более приятные вещи
Изменить: я не говорю, что таймер — лучший способ сделать это, но это хороший и действенный способ.
Использование Thread.Sleep — плохой выбор дизайна по нескольким причинам:
- Он блокирует поток на время, пока он спит.
- Он использует потоки в пуле потоков, поэтому это решение вообще не будет хорошо масштабироваться.
- Это плохой механизм синхронизации, потому что здесь задействован временной интервал или квант, который различается между операционными системами и даже версиями одной и той же операционной системы (читай: Windows).
Этот предыдущий вопрос SO дает больше информации о том, почему Thread.Sleep плохой:
Почему Thread.Sleep так вреден
Thread.Sleep
в текущем потоке пользовательского интерфейса? - person gunr2171   schedule 21.07.2013