logo search
Литература_1 / photon_old

Модальные операции и потоки

Модальная операция – это та, где Вам надо ожидать появления какого-то конкретного события перед тем, как Вы можете начать исполнение – например, когда Вы хотите, чтобы пользователь принял решение и нажал кнопку "Да" или "Нет". Поскольку обычно до того, как появится ожидаемое, обычно придут другие события, Вам надо гарантировать, что они обработаны.

В однопоточном приложении прикрепите ответную реакцию к кнопкам "Да" и "Нет". В этой ответной реакции вызовите PtModalUnblock(). Когда Вы отобразите диалог, вызовите функцию PtModalBlock(). Эта функция запустит петлю обработки событий, похожую на PtMainLoop(), за исключением того, что функция PtModalBlock() возвращает управление, когда что-нибудь (например, ответная реакция, прикреплённая к кнопкам "Да" и "Нет"), вызовет PtModalUnblock().

В многопоточном приложении функция PtModalBlock() может:

или

По умолчанию функция PtModalBlock() использует переменную состояния, если у Вас имеются какие-либо другие Photon'овские потоки. Она удаляет поток из пула обрабатывающих события потоков, но предотвращает ситуацию, когда запущенная вторая модальная операция в потоке, который запустил петлю в PtModalBlock(), делает невозможным для первой PtModalBlock() вернуть управление до тех пор, пока вторая модальная операция не будет завершена.

В большинстве приложений этого не должно произойти; обычно Вы либо не хотите позволить другие модальные операции до тех пор, пока выполняющаяся в текущий момент не завершится, либо же Вы действительно хотите получить стековый характер действий, когда вторая модальная операция не допускает завершания первой. Например, если первая модальная операция – это файловый селектор, и вторая – это вопрос "Вы уверены, что хотите переписать этот файл?", Вы не хотите позволить пользователю закрыть файловый селектор до ответа на вопрос.

Если Вы знаете, что Ваше приложение не имеет двух несвязанных модальных операций, которые могут выполняться одновременно, но могут завершаться в любом порядке, Вы можете передать признак Pt_EVENT_PROCESS_ALLOW в функцию PtModalBlock(). Это указывает функции PtModalBlock() запустить петлю событий, даже если Вы имеете другие доступные Photon'овские потоки, и может уменьшить общее число Photon'овских потоков, которые нужны Вашему приложению.