Как заставить выполнение кода приостанавливаться, пока не будет сказано продолжить? Это возможно без использования потоков? - PullRequest
1 голос
/ 01 марта 2011

То, что я пытаюсь достичь, похоже на то, что делает окно сообщения, которое запрашивает подтверждение в Windows.Когда отображается окно сообщения, код, который вызвал его, блокируется до тех пор, пока пользователь не нажмет «Да» или «Нет».Я хочу сделать то же самое, но окно сообщения недостаточно гибкое.

Я занимаюсь разработкой простой игры и поэтому стараюсь избегать решения для конкретного языка (решение, которое работает только для одного языка программирования),Таким образом, я смогу портировать игру на разные платформы, такие как iphone, windows, mac и т. Д. Без особых изменений в дизайне кода.

Чтобы привести пример псевдокода и предположить, что у меня есть массив:

для (int i = 0; i <5; i ++) <br>{
... Код для отображения компонента пользовательского интерфейса, похожего на окно сообщения. ==> Здесь код должен ждать, пока пользователь не выберет «Да» или «НЕТ» из компонента пользовательского интерфейса.
}

Я попробовал следующее решение:

bool userClickedYesOrNo = false;
для (int i = 0; i <5; i ++) {</strong>
...
Код для отображения сообщения-коробчатый компонент пользовательского интерфейса. ==> Выполнение кода не блокируется
while (userClickedYesOrNo == false) {
// когда пользователь нажимает да / нет в пользовательском интерфейсе, тогдаuserClickedYesOrNo становится истинным
}
}

К сожалению, в Windows, если я использую цикл while, пользовательский интерфейс замораживается, и пользователь не будетполучить шанс на взаимодействиес этим.

1 Ответ

1 голос
/ 01 марта 2011

Большая часть кода, который не использует потоки, но хочет вести себя интерактивно, основана на событиях.

Например, стандартный ' цикл отображения ' в приложении Java SWTустанавливает все графические компоненты, а затем идет в бесконечный цикл.Точно так же JavaScript на веб-странице имеет только один поток, поэтому необходимо зарегистрировать обработчики для событий таймера и т. Д. Для обработки взаимодействия в сочетании с текущей фоновой обработкой.

Внутри основного цикла кодпроверяет, есть ли ожидающее задание, и если да, задание запускается.

В вашей игре вы можете сделать что-то подобное, имея задание «обновление», которое обновляет состояние игры каждые 0,5 с (скажем) и срабатывает по таймеру.Когда вы открываете диалоговое окно, вы можете установить флаг, который говорит «пауза», так что событие обновления просто возвращается вместо выполнения какой-либо работы.Это позволяет обрабатывать события графического интерфейса вашим циклом отображения, а при нажатии кнопки флаг паузы можно удалить, что позволяет продолжить игру.

...