Сон блокирует всю программу (Smalltalk Squeak)

Я делаю N*N королевы проблемы с графическим интерфейсом. Я хочу, чтобы графический интерфейс останавливался на x секунд при каждом движении каждой королевы, проблема в том, что программа просто складывает все ожидания вместе, а затем запускает все на скорости. Я даю код здесь: http://pastebin.com/s2VT0E49

РЕДАКТИРОВАТЬ: Это мое рабочее пространство:

board := MyBoard new initializeWithStart: 8.
Transcript show:'something'.
3 seconds asDelay wait.
board solve.
3 seconds asDelay wait.
board closeBoard.

Вот где я хочу, чтобы ожидание произошло

canAttack: testRow x: testColumn
    | columnDifference  squareMark |
    columnDifference := testColumn - column.
    ((row = testRow
        or: [row + columnDifference = testRow])
        or: [row - columnDifference = testRow]) ifTrue: [
            squareDraw := squareDraw
            color: Color red.
            0.2 seconds asDelay wait.           
            ^ true ].

  squareDraw := squareDraw color: Color black.
  ^ neighbor canAttack: testRow x: testColumn

3 ответа

Решение

Чтобы ваш код рабочего пространства работал, вставьте его до задержки:

World doOneCycle.

Это приведет к повторному отображению морфийского мира.

Обратите внимание, что это быстрый и очень грязный хакерский код, а не правильный способ сделать это (см. Мой другой ответ). Задержки блокируют весь процесс пользовательского интерфейса, тогда как весь смысл Morphic заключается в том, что вы можете делать много вещей одновременно во время выполнения кода.

Поскольку вы используете Morphic, вы должны использовать пошаговый режим для анимации, а не для процессов или задержек. В вашем Morph реализовать step метод. Это будет выполнено автоматически и повторно. Также реализовать stepTime ответить на интервал в миллисекундах, например 4000 за каждые 4 секунды.

Внутри пошагового метода рассчитайте свое новое состояние. Если каждая королева моделируется как отдельный Morph, и вы просто перемещаете позиции, то Morphic позаботится об обновлении экрана. Если у вас есть свой drawOn: метод затем вызвать self changed в вашем step метод, чтобы Morphic позже вызывал ваш код для рисования.

Смотрите этот учебник: http://static.squeak.org/tutorials/morphic-tutorial-1.html

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

[ MyProgram run ] forkAt: Processor userBackgroundPriority.

Обратите внимание, что процесс пользовательского интерфейса обычно выполняется с приоритетом 40. #userBackgroundPriority 30. Это гарантирует, что вы не можете заблокировать пользовательский интерфейс.

Другие вопросы по тегам