Thread.Sleep или Timer для отображения каждого шага

Я делаю игру wumpus world в winforms, в которой агент (компьютер) может двигаться в 4-х направлениях. Я использую кнопку управления для базы и показа и скрытия изображений, где это необходимо. я использовал Thread.Sleep для этого, но проблема в том, что когда я нажимаю кнопку, ничего не отображается в форме. процесс в фоновом режиме работает нормально, но не показывает каждый шаг. и да, я использую Thread.Sleep в текущем потоке UI.
Я хочу показывать пользователям каждый шаг с интервалом в 2 секунды.


person syed mohsin    schedule 21.07.2013    source источник
comment
Вы используете Thread.Sleep в текущем потоке пользовательского интерфейса?   -  person gunr2171    schedule 21.07.2013


Ответы (2)


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

лучшим способом сделать это будет таймер, сделайте его одним таймером и очередью событий, которые нужно показать, и вы уже на пути к этому.

вы работаете над winForms, потому что, если вы работаете над WPF, вы можете делать гораздо более приятные вещи

Изменить: я не говорю, что таймер — лучший способ сделать это, но это хороший и действенный способ.

person No Idea For Name    schedule 21.07.2013

Использование Thread.Sleep — плохой выбор дизайна по нескольким причинам:

  1. Он блокирует поток на время, пока он спит.
  2. Он использует потоки в пуле потоков, поэтому это решение вообще не будет хорошо масштабироваться.
  3. Это плохой механизм синхронизации, потому что здесь задействован временной интервал или квант, который различается между операционными системами и даже версиями одной и той же операционной системы (читай: Windows).

Этот предыдущий вопрос SO дает больше информации о том, почему Thread.Sleep плохой:

Почему Thread.Sleep так вреден

person Karl Anderson    schedule 21.07.2013