То, что вы сможете сделать, скорее всего, будет зависеть от того, как работает DFL. Как правило, в приложении с графическим интерфейсом есть поток событий, который обрабатывает все события в вашем приложении — будь то события перерисовки, события нажатия кнопки, события щелчка мыши или что-то еще. Этот поток вызывает обработчик событий, который зарегистрирован для обработки события (часто это виджет, на который нажали, или что-то еще). Проблема, с которой вы сталкиваетесь, заключается в том, что если вы попытаетесь сделать слишком много в этих обработчиках событий, вы заблокируете поток событий, поэтому другие события (включая события перерисовки) не обрабатываются своевременно. Некоторые инструменты GUI даже специально ограничивают то, что вам разрешено делать в обработчике событий. Некоторые также ограничивают определенные типы операций этим конкретным потоком (например, выполнение чего-либо — особенно создание объектов — с фактическим кодом GUI, таким как различные виджеты или классы окон, которые обязательно должны быть в наборе инструментов).
Как правило, способ справиться с этим состоит в том, чтобы поток событий либо запускал отдельные потоки в обработчиках событий и позволял этим другим потокам фактически обрабатывать события, либо вы задавали некоторое количество состояний в обработчике событий, отдельном, уже запущенном поток предупреждается об этом изменении состояния (возможно, с использованием шаблона наблюдателя) и обрабатывает вещи соответствующим образом на основе этого состояния. В любом случае то, что делают сами обработчики событий, обычно довольно ограничено.
Как работают графические интерфейсы, как правило, очень основаны на событиях. Программа обрабатывает события, поступающие от пользователя и системы, и почти ничего не делает без получения сигнала об этом. Часто приложения с графическим интерфейсом не делают ничего, пока им не сообщит об этом событие (хотя во многих случаях фоновый поток выполняет какую-то работу отдельно от событий). То, что вы пытаетесь сделать, не выглядит особенно основанным на событиях, так что это немного усложняет ситуацию.
Я предполагаю, что вам нужно будет, чтобы ваше приложение создавало новое окно каждый раз, когда вы хотите создать новый сюжет. Это окно, вероятно, будет дочерним окном главного окна, которое будет скрыто, поскольку оно вам явно не нужно, и, предположительно, DFL требует, чтобы у вас было какое-то главное окно. Существует неплохая вероятность того, что каждый поток, который хотел создать окно, должен будет сообщить об этом главному окну графического интерфейса, но на самом деле это зависит от DFL. Также возможно, что DFL позволяет любому потоку создавать новые элементы графического интерфейса (например, новое окно).
В любом случае, это почти наверняка будет основной поток событий, который фактически обрабатывает окно. Поток, который хочет создать окно и заполнить его, вероятно, должен будет создать окно (прямо или косвенно), а затем обновить состояние окна, обновив набор общих переменных, чтобы поток событий мог соответствующим образом перерисовать окно. . Максимум, что первоначальный поток мог бы сделать, фактически перерисовать окно, это отправить событие перерисовки окну после того, как он обновил состояние общих переменных, содержащих данные, необходимые для рисования окна. Он не справился бы с самой картиной.
Что касается блокировки потока, то, скорее всего, ему придется ждать, пока событие закрытия окна не будет получено потоком событий, и какая-то общая переменная не будет обновлена, или вы можете заставить его перейти в спящий режим, пока поток событий не разбудит его после получение события закрытия окна. В случае, когда вы не хотите, чтобы он блокировался, он просто не будет ждать, пока ему сообщат о событии закрытия окна, и будет продолжать пыхтеть.
В любом случае, надеюсь, этой информации достаточно, чтобы направить вас в правильном направлении. Обычно события управляют всем, и все, так сказать, зависает от графического интерфейса. Но в вашем случае ваше приложение использует графический интерфейс, больше похожий на стандартный вывод. Таким образом, вам лучше сначала поработать над некоторыми небольшими, довольно глупыми приложениями с графическим интерфейсом, которые являются реальными, нормальными, основанными на событиях приложениями с графическим интерфейсом (например, игра в крестики-нолики или что-то в этом роде), чтобы получить лучшее представление о том, как Материал GUI работает, прежде чем пытаться заставить его работать несколько менее стандартным образом, как вы.
person
Jonathan M Davis
schedule
08.07.2010